1
1
use anyhow:: { Context , Result } ;
2
2
use camino:: Utf8Path ;
3
- use itertools:: chain;
3
+ use itertools:: { chain, Itertools } ;
4
4
use std:: fs;
5
5
6
6
use crate :: docs_generation:: markdown:: book_toml:: generate_book_toml_content;
7
7
use crate :: docs_generation:: markdown:: summary:: generate_summary_file_content;
8
- use crate :: docs_generation:: markdown:: traits:: TopLevelMarkdownDocItem ;
8
+ use crate :: docs_generation:: markdown:: traits:: {
9
+ generate_markdown_list_for_top_level_subitems, TopLevelMarkdownDocItem ,
10
+ } ;
9
11
use crate :: docs_generation:: { collect_all_top_level_items, TopLevelItems } ;
12
+ use crate :: types:: {
13
+ Constant , Enum , ExternFunction , ExternType , FreeFunction , Impl , ImplAlias , Module , Struct ,
14
+ Trait , TypeAlias ,
15
+ } ;
10
16
use crate :: PackageInformation ;
11
17
12
18
mod book_toml;
@@ -18,49 +24,102 @@ const SOURCE_DIRECTORY: &str = "src";
18
24
const BOOK_TOML_FILENAME : & str = "book.toml" ;
19
25
const SUMMARY_FILENAME : & str = "SUMMARY.md" ;
20
26
21
- pub struct MarkdownContent < ' a > {
27
+ type Filename = String ;
28
+
29
+ pub struct MarkdownContent {
22
30
book_toml : String ,
23
31
summary : String ,
24
- top_level_docs : Vec < ( & ' a dyn TopLevelMarkdownDocItem , String ) > ,
32
+ doc_files : Vec < ( Filename , String ) > ,
25
33
}
26
34
27
- impl < ' a > MarkdownContent < ' a > {
28
- pub fn from_crate ( package_information : & ' a PackageInformation ) -> Self {
35
+ impl MarkdownContent {
36
+ pub fn from_crate ( package_information : & PackageInformation ) -> Self {
29
37
let top_level_items = collect_all_top_level_items ( & package_information. crate_ ) ;
30
38
39
+ let summary_file_content = generate_summary_file_content ( & top_level_items) ;
31
40
let TopLevelItems {
32
- ref modules,
33
- ref constants,
34
- ref free_functions,
35
- ref structs,
36
- ref enums,
37
- ref type_aliases,
38
- ref impl_aliases,
39
- ref traits,
40
- ref impls,
41
- ref extern_types,
42
- ref extern_functions,
41
+ modules,
42
+ constants,
43
+ free_functions,
44
+ structs,
45
+ enums,
46
+ type_aliases,
47
+ impl_aliases,
48
+ traits,
49
+ impls,
50
+ extern_types,
51
+ extern_functions,
43
52
} = top_level_items;
44
53
45
- let top_level_docs = chain ! (
46
- generate_top_level_docs_contents( modules) ,
47
- generate_top_level_docs_contents( constants) ,
48
- generate_top_level_docs_contents( free_functions) ,
49
- generate_top_level_docs_contents( structs) ,
50
- generate_top_level_docs_contents( enums) ,
51
- generate_top_level_docs_contents( type_aliases) ,
52
- generate_top_level_docs_contents( impl_aliases) ,
53
- generate_top_level_docs_contents( traits) ,
54
- generate_top_level_docs_contents( impls) ,
55
- generate_top_level_docs_contents( extern_types) ,
56
- generate_top_level_docs_contents( extern_functions) ,
54
+ let docs_for_top_level_items = chain ! (
55
+ generate_top_level_docs_contents( & modules) ,
56
+ generate_top_level_docs_contents( & constants) ,
57
+ generate_top_level_docs_contents( & free_functions) ,
58
+ generate_top_level_docs_contents( & structs) ,
59
+ generate_top_level_docs_contents( & enums) ,
60
+ generate_top_level_docs_contents( & type_aliases) ,
61
+ generate_top_level_docs_contents( & impl_aliases) ,
62
+ generate_top_level_docs_contents( & traits) ,
63
+ generate_top_level_docs_contents( & impls) ,
64
+ generate_top_level_docs_contents( & extern_types) ,
65
+ generate_top_level_docs_contents( & extern_functions) ,
57
66
)
58
- . collect ( ) ;
67
+ . collect_vec ( ) ;
68
+
69
+ let summaries_for_top_level_items = vec ! [
70
+ (
71
+ Module :: ITEMS_SUMMARY_FILENAME . to_string( ) ,
72
+ generate_markdown_list_for_top_level_subitems( & modules, BASE_HEADER_LEVEL ) ,
73
+ ) ,
74
+ (
75
+ Constant :: ITEMS_SUMMARY_FILENAME . to_string( ) ,
76
+ generate_markdown_list_for_top_level_subitems( & constants, BASE_HEADER_LEVEL ) ,
77
+ ) ,
78
+ (
79
+ FreeFunction :: ITEMS_SUMMARY_FILENAME . to_string( ) ,
80
+ generate_markdown_list_for_top_level_subitems( & free_functions, BASE_HEADER_LEVEL ) ,
81
+ ) ,
82
+ (
83
+ Struct :: ITEMS_SUMMARY_FILENAME . to_string( ) ,
84
+ generate_markdown_list_for_top_level_subitems( & structs, BASE_HEADER_LEVEL ) ,
85
+ ) ,
86
+ (
87
+ Enum :: ITEMS_SUMMARY_FILENAME . to_string( ) ,
88
+ generate_markdown_list_for_top_level_subitems( & enums, BASE_HEADER_LEVEL ) ,
89
+ ) ,
90
+ (
91
+ TypeAlias :: ITEMS_SUMMARY_FILENAME . to_string( ) ,
92
+ generate_markdown_list_for_top_level_subitems( & type_aliases, BASE_HEADER_LEVEL ) ,
93
+ ) ,
94
+ (
95
+ ImplAlias :: ITEMS_SUMMARY_FILENAME . to_string( ) ,
96
+ generate_markdown_list_for_top_level_subitems( & impl_aliases, BASE_HEADER_LEVEL ) ,
97
+ ) ,
98
+ (
99
+ Trait :: ITEMS_SUMMARY_FILENAME . to_string( ) ,
100
+ generate_markdown_list_for_top_level_subitems( & traits, BASE_HEADER_LEVEL ) ,
101
+ ) ,
102
+ (
103
+ Impl :: ITEMS_SUMMARY_FILENAME . to_string( ) ,
104
+ generate_markdown_list_for_top_level_subitems( & impls, BASE_HEADER_LEVEL ) ,
105
+ ) ,
106
+ (
107
+ ExternType :: ITEMS_SUMMARY_FILENAME . to_string( ) ,
108
+ generate_markdown_list_for_top_level_subitems( & extern_types, BASE_HEADER_LEVEL ) ,
109
+ ) ,
110
+ (
111
+ ExternFunction :: ITEMS_SUMMARY_FILENAME . to_string( ) ,
112
+ generate_markdown_list_for_top_level_subitems( & extern_functions, BASE_HEADER_LEVEL ) ,
113
+ ) ,
114
+ ]
115
+ . into_iter ( )
116
+ . filter ( |( _filename, content) | !content. is_empty ( ) )
117
+ . collect_vec ( ) ;
59
118
60
119
Self {
61
120
book_toml : generate_book_toml_content ( & package_information. metadata ) ,
62
- summary : generate_summary_file_content ( & top_level_items ) ,
63
- top_level_docs ,
121
+ summary : summary_file_content ,
122
+ doc_files : chain ! ( docs_for_top_level_items , summaries_for_top_level_items ) . collect ( ) ,
64
123
}
65
124
}
66
125
@@ -75,25 +134,20 @@ impl<'a> MarkdownContent<'a> {
75
134
fs:: write ( source_directory_path. join ( SUMMARY_FILENAME ) , self . summary )
76
135
. context ( "failed to write summary content to a file" ) ?;
77
136
78
- for ( item , file_content) in self . top_level_docs {
79
- fs:: write ( source_directory_path. join ( item . filename ( ) ) , file_content)
80
- . context ( "failed to write content to a file" ) ?;
137
+ for ( filename , file_content) in self . doc_files {
138
+ fs:: write ( source_directory_path. join ( filename) , file_content)
139
+ . context ( "failed to write content to a doc file" ) ?;
81
140
}
82
141
83
142
Ok ( ( ) )
84
143
}
85
144
}
86
145
87
- fn generate_top_level_docs_contents < ' a > (
88
- items : & [ & ' a impl TopLevelMarkdownDocItem ] ,
89
- ) -> Vec < ( & ' a dyn TopLevelMarkdownDocItem , String ) > {
146
+ fn generate_top_level_docs_contents (
147
+ items : & [ & impl TopLevelMarkdownDocItem ] ,
148
+ ) -> Vec < ( Filename , String ) > {
90
149
items
91
150
. iter ( )
92
- . map ( |item| {
93
- (
94
- * item as & dyn TopLevelMarkdownDocItem ,
95
- item. generate_markdown ( BASE_HEADER_LEVEL ) ,
96
- )
97
- } )
151
+ . map ( |item| ( item. filename ( ) , item. generate_markdown ( BASE_HEADER_LEVEL ) ) )
98
152
. collect ( )
99
153
}
0 commit comments