1
1
#[ doc = "Generate markdown from a document tree" ] ;
2
2
3
- import std:: io;
4
- import std:: io:: writer_util;
5
-
6
3
export mk_pass;
7
4
8
5
fn mk_pass ( config : config:: config ) -> pass {
9
- mk_pass_ ( config, { |f| f ( std:: io:: stdout ( ) ) } )
6
+ mk_pass_ ( config, stdout_writer)
7
+ }
8
+
9
+ enum writeinstr {
10
+ write( str ) ,
11
+ done
12
+ }
13
+
14
+ type writer = fn ~( writeinstr ) ;
15
+
16
+ impl writer for writer {
17
+ fn write_str ( str : str ) {
18
+ self ( write ( str) ) ;
19
+ }
20
+
21
+ fn write_line ( str : str ) {
22
+ self . write_str ( str + "\n " ) ;
23
+ }
24
+
25
+ fn write_done ( ) {
26
+ self ( done)
27
+ }
28
+ }
29
+
30
+ fn stdout_writer ( instr : writeinstr ) {
31
+ alt instr {
32
+ write( str) { std:: io:: println ( str) ; }
33
+ done { }
34
+ }
10
35
}
11
36
12
37
// FIXME: This is a really convoluted interface to work around trying
13
38
// to get a writer into a unique closure and then being able to test
14
39
// what was written afterward
15
40
fn mk_pass_ (
16
41
config : config:: config ,
17
- give_writer : fn ~ ( fn ( io :: writer ) )
42
+ writer : writer
18
43
) -> pass {
19
44
let f = fn ~( srv: astsrv:: srv, doc: doc:: cratedoc) -> doc:: cratedoc {
20
- run( srv, doc, config, give_writer )
45
+ run( srv, doc, config, writer )
21
46
} ;
22
47
23
48
{
@@ -30,7 +55,7 @@ fn run(
30
55
srv : astsrv:: srv ,
31
56
doc : doc:: cratedoc ,
32
57
_config : config:: config ,
33
- give_writer : fn ~ ( fn ( io :: writer ) )
58
+ writer : writer
34
59
) -> doc:: cratedoc {
35
60
36
61
fn mods_last ( item1 : doc:: itemtag , item2 : doc:: itemtag ) -> bool {
@@ -45,17 +70,16 @@ fn run(
45
70
lteq
46
71
}
47
72
48
- give_writer { |writer|
49
- // Sort the items so mods come last. All mods will be
50
- // output at the same header level so sorting mods last
51
- // makes the headers come out nested correctly.
52
- let sorted_doc = sort_pass:: mk_pass (
53
- "mods last" , mods_last
54
- ) . f ( srv, doc) ;
73
+ // Sort the items so mods come last. All mods will be
74
+ // output at the same header level so sorting mods last
75
+ // makes the headers come out nested correctly.
76
+ let sorted_doc = sort_pass:: mk_pass (
77
+ "mods last" , mods_last
78
+ ) . f ( srv, doc) ;
55
79
56
- write_markdown ( sorted_doc, writer) ;
57
- }
58
- doc
80
+ write_markdown ( sorted_doc, writer) ;
81
+
82
+ ret doc;
59
83
}
60
84
61
85
#[ test]
@@ -85,18 +109,19 @@ fn should_write_modules_last() {
85
109
}
86
110
87
111
type ctxt = {
88
- w : io :: writer
112
+ w : writer
89
113
} ;
90
114
91
115
fn write_markdown (
92
116
doc : doc:: cratedoc ,
93
- writer : io :: writer
117
+ writer : writer
94
118
) {
95
119
let ctxt = {
96
120
w: writer
97
121
} ;
98
122
99
123
write_crate ( ctxt, doc) ;
124
+ ctxt. w . write_done ( ) ;
100
125
}
101
126
102
127
enum hlvl {
@@ -853,31 +878,45 @@ mod test {
853
878
doc
854
879
}
855
880
881
+ fn writer_future ( ) -> ( writer , future:: future < str > ) {
882
+ let port = comm:: port ( ) ;
883
+ let chan = comm:: chan ( port) ;
884
+ let writer = fn ~( instr: writeinstr) {
885
+ comm:: send ( chan, copy instr) ;
886
+ } ;
887
+ let future = future:: from_fn { ||
888
+ let res = "" ;
889
+ while true {
890
+ alt comm:: recv ( port) {
891
+ write ( s) { res += s }
892
+ done { break }
893
+ }
894
+ }
895
+ res
896
+ } ;
897
+ ( writer, future)
898
+ }
899
+
856
900
fn write_markdown_str (
857
901
doc : doc:: cratedoc
858
902
) -> str {
859
- let buffer = io:: mk_mem_buffer ( ) ;
860
- let writer = io:: mem_buffer_writer ( buffer) ;
903
+ let ( writer, future) = writer_future ( ) ;
861
904
write_markdown ( doc, writer) ;
862
- ret io :: mem_buffer_str ( buffer ) ;
905
+ ret future :: get ( future ) ;
863
906
}
864
907
865
908
fn write_markdown_str_srv (
866
909
srv : astsrv:: srv ,
867
910
doc : doc:: cratedoc
868
911
) -> str {
869
- let port = comm:: port ( ) ;
870
- let chan = comm:: chan ( port) ;
871
-
872
- let pass = mk_pass_ ( config:: default_config ( "" ) ) { |f|
873
- let buffer = io:: mk_mem_buffer ( ) ;
874
- let writer = io:: mem_buffer_writer ( buffer) ;
875
- f ( writer) ;
876
- let result = io:: mem_buffer_str ( buffer) ;
877
- comm:: send ( chan, result) ;
912
+ let config = {
913
+ output_style: config:: doc_per_crate
914
+ with config:: default_config ( "" )
878
915
} ;
916
+ let ( writer, future) = writer_future ( ) ;
917
+ let pass = mk_pass_ ( config, writer) ;
879
918
pass. f ( srv, doc) ;
880
- ret comm :: recv ( port ) ;
919
+ ret future :: get ( future ) ;
881
920
}
882
921
883
922
#[ test]
0 commit comments