diff --git a/Cargo.lock b/Cargo.lock index 65a6f1da6..f5f4826bf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -318,7 +318,7 @@ checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -329,7 +329,7 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -769,7 +769,7 @@ version = "0.0.1" dependencies = [ "quote", "scarb-stable-hash", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -820,7 +820,7 @@ source = "git+https://github.com/starkware-libs/cairo?rev=d0273bcc88a14c39fe61d7 dependencies = [ "cairo-lang-debug", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -1277,7 +1277,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -1544,7 +1544,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -1555,7 +1555,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -1632,7 +1632,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -1642,7 +1642,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "206868b8242f27cecce124c19fd88157fbd0dd334df2587f36417bafbc85097b" dependencies = [ "derive_builder_core", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -1991,7 +1991,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -2061,7 +2061,7 @@ checksum = "553630feadf7b76442b0849fd25fdf89b860d933623aec9693fed19af0400c78" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -2508,7 +2508,7 @@ checksum = "999ce923619f88194171a67fb3e6d613653b8d4d6078b529b15a765da0edcc17" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -3480,9 +3480,9 @@ checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libloading" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d" +checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", "windows-targets 0.52.5", @@ -3515,7 +3515,7 @@ checksum = "f8dccda732e04fa3baf2e17cf835bfe2601c7c2edafd64417c627dabae3a8cda" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -3894,9 +3894,9 @@ checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" [[package]] name = "openssl" -version = "0.10.64" +version = "0.10.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" dependencies = [ "bitflags 2.5.0", "cfg-if", @@ -3915,7 +3915,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -3926,9 +3926,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.102" +version = "0.9.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" dependencies = [ "cc", "libc", @@ -4142,7 +4142,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -4721,7 +4721,7 @@ dependencies = [ "thiserror", "tokio", "toml", - "toml_edit 0.22.15", + "toml_edit 0.22.16", "tracing", "tracing-subscriber", "typed-builder", @@ -4927,7 +4927,7 @@ dependencies = [ "sha2", "snapbox", "tokio", - "toml_edit 0.22.15", + "toml_edit 0.22.16", "tower-http", "url", ] @@ -4979,7 +4979,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -5068,7 +5068,7 @@ checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -5079,7 +5079,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -5111,7 +5111,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -5370,7 +5370,7 @@ checksum = "bbc159a1934c7be9761c237333a57febe060ace2bc9e3b337a59a37af206d19f" dependencies = [ "starknet-curve", "starknet-ff", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -5453,9 +5453,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.71" +version = "2.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b146dcf730474b4bcd16c311627b31ede9ab149045db4d6088b3becaea046462" +checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" dependencies = [ "proc-macro2", "quote", @@ -5553,7 +5553,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -5564,7 +5564,7 @@ checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", "test-case-core", ] @@ -5576,27 +5576,27 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] name = "thiserror" -version = "1.0.62" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2675633b1499176c2dff06b0856a27976a8f9d436737b4cf4f312d4d91d8bbb" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.62" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d20468752b09f49e909e55a5d338caa8bedf615594e9d80bc4c565d30faf798c" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -5688,9 +5688,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.38.0" +version = "1.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" +checksum = "eb2caba9f80616f438e09748d5acda951967e1ea58508ef53d9c6402485a46df" dependencies = [ "backtrace", "bytes", @@ -5713,7 +5713,7 @@ checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -5751,14 +5751,14 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.14" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335" +checksum = "ac2caab0bf757388c6c0ae23b3293fdb463fee59434529014f85e3263b995c28" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.15", + "toml_edit 0.22.16", ] [[package]] @@ -5783,9 +5783,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.15" +version = "0.22.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59a3a72298453f564e2b111fa896f8d07fabb36f51f06d7e875fc5e0b5a3ef1" +checksum = "278f3d518e152219c994ce877758516bca5e118eaed6996192a774fb9fbf0788" dependencies = [ "indexmap 2.2.6", "serde", @@ -5872,7 +5872,7 @@ checksum = "84fd902d4e0b9a4b27f2f440108dc034e1758628a9b702f8ec61ad66355422fa" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -5901,7 +5901,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -5977,7 +5977,7 @@ checksum = "f9534daa9fd3ed0bd911d462a37f172228077e7abf18c18a5f67199d959205f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -6161,7 +6161,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", "wasm-bindgen-shared", ] @@ -6195,7 +6195,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -6484,7 +6484,7 @@ dependencies = [ "semver", "serde_json", "time", - "toml_edit 0.22.15", + "toml_edit 0.22.16", "walkdir", "xshell", ] @@ -6518,7 +6518,7 @@ checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -6538,7 +6538,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 6c9ac2e0c..5379ab413 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -85,7 +85,7 @@ inquire = "0.7.5" io_tee = "0.1" itertools = "0.12" libc = "0.2" -libloading = "0.8.4" +libloading = "0.8.5" linkme = "0.3" log = "0.4" ntest = "0.9" diff --git a/extensions/scarb-doc/src/docs_generation.rs b/extensions/scarb-doc/src/docs_generation.rs index 42f09df46..fe974892b 100644 --- a/extensions/scarb-doc/src/docs_generation.rs +++ b/extensions/scarb-doc/src/docs_generation.rs @@ -106,6 +106,8 @@ impl TopLevelDocItem for TypeAlias {} // Wrapper trait over a documentable item to hide implementation details of the item type. trait DocItem { + const HEADER: &'static str; + fn name(&self) -> &str; fn doc(&self) -> &Option; fn signature(&self) -> &Option; @@ -113,8 +115,10 @@ trait DocItem { } macro_rules! impl_doc_item { - ($t:ty) => { + ($t:ty, $name:expr) => { impl DocItem for $t { + const HEADER: &'static str = $name; + fn name(&self) -> &str { &self.item_data.name } @@ -134,22 +138,22 @@ macro_rules! impl_doc_item { }; } -impl_doc_item!(Constant); -impl_doc_item!(Enum); -impl_doc_item!(ExternFunction); -impl_doc_item!(ExternType); -impl_doc_item!(FreeFunction); -impl_doc_item!(Impl); -impl_doc_item!(ImplAlias); -impl_doc_item!(ImplConstant); -impl_doc_item!(ImplFunction); -impl_doc_item!(ImplType); -impl_doc_item!(Member); -impl_doc_item!(Module); -impl_doc_item!(Struct); -impl_doc_item!(Trait); -impl_doc_item!(TraitConstant); -impl_doc_item!(TraitType); -impl_doc_item!(TraitFunction); -impl_doc_item!(TypeAlias); -impl_doc_item!(Variant); +impl_doc_item!(Constant, "Constants"); +impl_doc_item!(Enum, "Enums"); +impl_doc_item!(ExternFunction, "Extern functions"); +impl_doc_item!(ExternType, "Extern types"); +impl_doc_item!(FreeFunction, "Free functions"); +impl_doc_item!(Impl, "Impls"); +impl_doc_item!(ImplAlias, "Impl aliases"); +impl_doc_item!(ImplConstant, "Impl constants"); +impl_doc_item!(ImplFunction, "Impl functions"); +impl_doc_item!(ImplType, "Impl types"); +impl_doc_item!(Member, "Members"); +impl_doc_item!(Module, "Modules"); +impl_doc_item!(Struct, "Structs"); +impl_doc_item!(Trait, "Traits"); +impl_doc_item!(TraitConstant, "Trait constants"); +impl_doc_item!(TraitType, "Trait types"); +impl_doc_item!(TraitFunction, "Trait functions"); +impl_doc_item!(TypeAlias, "Type aliases"); +impl_doc_item!(Variant, "Variants"); diff --git a/extensions/scarb-doc/src/docs_generation/markdown.rs b/extensions/scarb-doc/src/docs_generation/markdown.rs index 1b4b214b8..c5b2ede90 100644 --- a/extensions/scarb-doc/src/docs_generation/markdown.rs +++ b/extensions/scarb-doc/src/docs_generation/markdown.rs @@ -1,12 +1,18 @@ use anyhow::{Context, Result}; use camino::Utf8Path; -use itertools::chain; +use itertools::{chain, Itertools}; use std::fs; use crate::docs_generation::markdown::book_toml::generate_book_toml_content; use crate::docs_generation::markdown::summary::generate_summary_file_content; -use crate::docs_generation::markdown::traits::TopLevelMarkdownDocItem; +use crate::docs_generation::markdown::traits::{ + generate_markdown_list_for_top_level_subitems, TopLevelMarkdownDocItem, +}; use crate::docs_generation::{collect_all_top_level_items, TopLevelItems}; +use crate::types::{ + Constant, Enum, ExternFunction, ExternType, FreeFunction, Impl, ImplAlias, Module, Struct, + Trait, TypeAlias, +}; use crate::PackageInformation; mod book_toml; @@ -18,49 +24,102 @@ const SOURCE_DIRECTORY: &str = "src"; const BOOK_TOML_FILENAME: &str = "book.toml"; const SUMMARY_FILENAME: &str = "SUMMARY.md"; -pub struct MarkdownContent<'a> { +type Filename = String; + +pub struct MarkdownContent { book_toml: String, summary: String, - top_level_docs: Vec<(&'a dyn TopLevelMarkdownDocItem, String)>, + doc_files: Vec<(Filename, String)>, } -impl<'a> MarkdownContent<'a> { - pub fn from_crate(package_information: &'a PackageInformation) -> Self { +impl MarkdownContent { + pub fn from_crate(package_information: &PackageInformation) -> Self { let top_level_items = collect_all_top_level_items(&package_information.crate_); + let summary_file_content = generate_summary_file_content(&top_level_items); let TopLevelItems { - ref modules, - ref constants, - ref free_functions, - ref structs, - ref enums, - ref type_aliases, - ref impl_aliases, - ref traits, - ref impls, - ref extern_types, - ref extern_functions, + modules, + constants, + free_functions, + structs, + enums, + type_aliases, + impl_aliases, + traits, + impls, + extern_types, + extern_functions, } = top_level_items; - let top_level_docs = chain!( - generate_top_level_docs_contents(modules), - generate_top_level_docs_contents(constants), - generate_top_level_docs_contents(free_functions), - generate_top_level_docs_contents(structs), - generate_top_level_docs_contents(enums), - generate_top_level_docs_contents(type_aliases), - generate_top_level_docs_contents(impl_aliases), - generate_top_level_docs_contents(traits), - generate_top_level_docs_contents(impls), - generate_top_level_docs_contents(extern_types), - generate_top_level_docs_contents(extern_functions), + let docs_for_top_level_items = chain!( + generate_top_level_docs_contents(&modules), + generate_top_level_docs_contents(&constants), + generate_top_level_docs_contents(&free_functions), + generate_top_level_docs_contents(&structs), + generate_top_level_docs_contents(&enums), + generate_top_level_docs_contents(&type_aliases), + generate_top_level_docs_contents(&impl_aliases), + generate_top_level_docs_contents(&traits), + generate_top_level_docs_contents(&impls), + generate_top_level_docs_contents(&extern_types), + generate_top_level_docs_contents(&extern_functions), ) - .collect(); + .collect_vec(); + + let summaries_for_top_level_items = vec![ + ( + Module::ITEMS_SUMMARY_FILENAME.to_string(), + generate_markdown_list_for_top_level_subitems(&modules, BASE_HEADER_LEVEL), + ), + ( + Constant::ITEMS_SUMMARY_FILENAME.to_string(), + generate_markdown_list_for_top_level_subitems(&constants, BASE_HEADER_LEVEL), + ), + ( + FreeFunction::ITEMS_SUMMARY_FILENAME.to_string(), + generate_markdown_list_for_top_level_subitems(&free_functions, BASE_HEADER_LEVEL), + ), + ( + Struct::ITEMS_SUMMARY_FILENAME.to_string(), + generate_markdown_list_for_top_level_subitems(&structs, BASE_HEADER_LEVEL), + ), + ( + Enum::ITEMS_SUMMARY_FILENAME.to_string(), + generate_markdown_list_for_top_level_subitems(&enums, BASE_HEADER_LEVEL), + ), + ( + TypeAlias::ITEMS_SUMMARY_FILENAME.to_string(), + generate_markdown_list_for_top_level_subitems(&type_aliases, BASE_HEADER_LEVEL), + ), + ( + ImplAlias::ITEMS_SUMMARY_FILENAME.to_string(), + generate_markdown_list_for_top_level_subitems(&impl_aliases, BASE_HEADER_LEVEL), + ), + ( + Trait::ITEMS_SUMMARY_FILENAME.to_string(), + generate_markdown_list_for_top_level_subitems(&traits, BASE_HEADER_LEVEL), + ), + ( + Impl::ITEMS_SUMMARY_FILENAME.to_string(), + generate_markdown_list_for_top_level_subitems(&impls, BASE_HEADER_LEVEL), + ), + ( + ExternType::ITEMS_SUMMARY_FILENAME.to_string(), + generate_markdown_list_for_top_level_subitems(&extern_types, BASE_HEADER_LEVEL), + ), + ( + ExternFunction::ITEMS_SUMMARY_FILENAME.to_string(), + generate_markdown_list_for_top_level_subitems(&extern_functions, BASE_HEADER_LEVEL), + ), + ] + .into_iter() + .filter(|(_filename, content)| !content.is_empty()) + .collect_vec(); Self { book_toml: generate_book_toml_content(&package_information.metadata), - summary: generate_summary_file_content(&top_level_items), - top_level_docs, + summary: summary_file_content, + doc_files: chain!(docs_for_top_level_items, summaries_for_top_level_items).collect(), } } @@ -75,25 +134,20 @@ impl<'a> MarkdownContent<'a> { fs::write(source_directory_path.join(SUMMARY_FILENAME), self.summary) .context("failed to write summary content to a file")?; - for (item, file_content) in self.top_level_docs { - fs::write(source_directory_path.join(item.filename()), file_content) - .context("failed to write content to a file")?; + for (filename, file_content) in self.doc_files { + fs::write(source_directory_path.join(filename), file_content) + .context("failed to write content to a doc file")?; } Ok(()) } } -fn generate_top_level_docs_contents<'a>( - items: &[&'a impl TopLevelMarkdownDocItem], -) -> Vec<(&'a dyn TopLevelMarkdownDocItem, String)> { +fn generate_top_level_docs_contents( + items: &[&impl TopLevelMarkdownDocItem], +) -> Vec<(Filename, String)> { items .iter() - .map(|item| { - ( - *item as &dyn TopLevelMarkdownDocItem, - item.generate_markdown(BASE_HEADER_LEVEL), - ) - }) + .map(|item| (item.filename(), item.generate_markdown(BASE_HEADER_LEVEL))) .collect() } diff --git a/extensions/scarb-doc/src/docs_generation/markdown/summary.rs b/extensions/scarb-doc/src/docs_generation/markdown/summary.rs index a012bdeb4..b1fa35a87 100644 --- a/extensions/scarb-doc/src/docs_generation/markdown/summary.rs +++ b/extensions/scarb-doc/src/docs_generation/markdown/summary.rs @@ -1,4 +1,6 @@ -use crate::docs_generation::markdown::traits::generate_markdown_list_for_top_level_subitems; +use std::fmt::Write; + +use crate::docs_generation::markdown::traits::TopLevelMarkdownDocItem; use crate::docs_generation::markdown::BASE_HEADER_LEVEL; use crate::docs_generation::TopLevelItems; @@ -21,40 +23,38 @@ pub fn generate_summary_file_content(top_level_items: &TopLevelItems) -> String extern_functions, } = top_level_items; - markdown += - &generate_markdown_list_for_top_level_subitems(modules, "Modules", BASE_HEADER_LEVEL); - markdown += - &generate_markdown_list_for_top_level_subitems(constants, "Constants", BASE_HEADER_LEVEL); - markdown += &generate_markdown_list_for_top_level_subitems( - free_functions, - "Free functions", - BASE_HEADER_LEVEL, - ); - markdown += - &generate_markdown_list_for_top_level_subitems(structs, "Structs", BASE_HEADER_LEVEL); - markdown += &generate_markdown_list_for_top_level_subitems(enums, "Enums", BASE_HEADER_LEVEL); - markdown += &generate_markdown_list_for_top_level_subitems( - type_aliases, - "Type Aliases", - BASE_HEADER_LEVEL, - ); - markdown += &generate_markdown_list_for_top_level_subitems( - impl_aliases, - "Impl Aliases", - BASE_HEADER_LEVEL, - ); - markdown += &generate_markdown_list_for_top_level_subitems(traits, "Traits", BASE_HEADER_LEVEL); - markdown += &generate_markdown_list_for_top_level_subitems(impls, "Impls", BASE_HEADER_LEVEL); - markdown += &generate_markdown_list_for_top_level_subitems( - extern_types, - "Extern types", - BASE_HEADER_LEVEL, - ); - markdown += &generate_markdown_list_for_top_level_subitems( - extern_functions, - "Extern functions", - BASE_HEADER_LEVEL, - ); + markdown += &generate_markdown_list_summary_for_top_level_subitems(modules); + markdown += &generate_markdown_list_summary_for_top_level_subitems(constants); + markdown += &generate_markdown_list_summary_for_top_level_subitems(free_functions); + markdown += &generate_markdown_list_summary_for_top_level_subitems(structs); + markdown += &generate_markdown_list_summary_for_top_level_subitems(enums); + markdown += &generate_markdown_list_summary_for_top_level_subitems(type_aliases); + markdown += &generate_markdown_list_summary_for_top_level_subitems(impl_aliases); + markdown += &generate_markdown_list_summary_for_top_level_subitems(traits); + markdown += &generate_markdown_list_summary_for_top_level_subitems(impls); + markdown += &generate_markdown_list_summary_for_top_level_subitems(extern_types); + markdown += &generate_markdown_list_summary_for_top_level_subitems(extern_functions); + + markdown +} + +fn generate_markdown_list_summary_for_top_level_subitems( + subitems: &[&T], +) -> String { + let mut markdown = String::new(); + + if !subitems.is_empty() { + writeln!( + &mut markdown, + "- [{}](./{})\n", + T::HEADER, + T::ITEMS_SUMMARY_FILENAME + ) + .unwrap(); + for item in subitems { + writeln!(&mut markdown, " {}", item.generate_markdown_list_item()).unwrap(); + } + } markdown } diff --git a/extensions/scarb-doc/src/docs_generation/markdown/traits.rs b/extensions/scarb-doc/src/docs_generation/markdown/traits.rs index 43eb80a0a..9c814d385 100644 --- a/extensions/scarb-doc/src/docs_generation/markdown/traits.rs +++ b/extensions/scarb-doc/src/docs_generation/markdown/traits.rs @@ -2,9 +2,14 @@ use itertools::Itertools; use std::fmt::Write; use crate::docs_generation::{DocItem, PrimitiveDocItem, TopLevelDocItem}; -use crate::types::{Enum, Impl, Module, Struct, Trait}; +use crate::types::{ + Constant, Enum, ExternFunction, ExternType, FreeFunction, Impl, ImplAlias, Module, Struct, + Trait, TypeAlias, +}; pub trait TopLevelMarkdownDocItem: MarkdownDocItem + TopLevelDocItem { + const ITEMS_SUMMARY_FILENAME: &'static str; + fn filename(&self) -> String { format!("{}.md", self.full_path().replace("::", "-")) } @@ -18,7 +23,25 @@ pub trait TopLevelMarkdownDocItem: MarkdownDocItem + TopLevelDocItem { } } -impl TopLevelMarkdownDocItem for T where T: MarkdownDocItem + TopLevelDocItem {} +macro_rules! impl_top_level_markdown_doc_item { + ($t:ty, $filename:expr) => { + impl TopLevelMarkdownDocItem for $t { + const ITEMS_SUMMARY_FILENAME: &'static str = $filename; + } + }; +} + +impl_top_level_markdown_doc_item!(Constant, "constants.md"); +impl_top_level_markdown_doc_item!(Enum, "enums.md"); +impl_top_level_markdown_doc_item!(ExternFunction, "extern_functions.md"); +impl_top_level_markdown_doc_item!(ExternType, "extern_types.md"); +impl_top_level_markdown_doc_item!(FreeFunction, "free_functions.md"); +impl_top_level_markdown_doc_item!(Impl, "impls.md"); +impl_top_level_markdown_doc_item!(ImplAlias, "impl_aliases.md"); +impl_top_level_markdown_doc_item!(Module, "modules.md"); +impl_top_level_markdown_doc_item!(Struct, "structs.md"); +impl_top_level_markdown_doc_item!(Trait, "traits.md"); +impl_top_level_markdown_doc_item!(TypeAlias, "type_aliases.md"); pub trait MarkdownDocItem: DocItem { fn generate_markdown(&self, header_level: usize) -> String; @@ -37,7 +60,7 @@ impl MarkdownDocItem for Enum { fn generate_markdown(&self, header_level: usize) -> String { let mut markdown = generate_markdown_from_item_data(self, header_level); - markdown += &generate_markdown_for_subitems(&self.variants, "Variants", header_level); + markdown += &generate_markdown_for_subitems(&self.variants, header_level); markdown } @@ -47,11 +70,9 @@ impl MarkdownDocItem for Impl { fn generate_markdown(&self, header_level: usize) -> String { let mut markdown = generate_markdown_from_item_data(self, header_level); - markdown += - &generate_markdown_for_subitems(&self.impl_constants, "Impl Constants", header_level); - markdown += - &generate_markdown_for_subitems(&self.impl_functions, "Impl Functions", header_level); - markdown += &generate_markdown_for_subitems(&self.impl_types, "Impl Types", header_level); + markdown += &generate_markdown_for_subitems(&self.impl_constants, header_level); + markdown += &generate_markdown_for_subitems(&self.impl_functions, header_level); + markdown += &generate_markdown_for_subitems(&self.impl_types, header_level); markdown } @@ -63,57 +84,46 @@ impl MarkdownDocItem for Module { markdown += &generate_markdown_list_for_top_level_subitems( &self.submodules.iter().collect_vec(), - "Submodules", header_level + 1, ); markdown += &generate_markdown_list_for_top_level_subitems( &self.constants.iter().collect_vec(), - "Constants", header_level + 1, ); markdown += &generate_markdown_list_for_top_level_subitems( &self.free_functions.iter().collect_vec(), - "Free functions", header_level + 1, ); markdown += &generate_markdown_list_for_top_level_subitems( &self.structs.iter().collect_vec(), - "Structs", header_level + 1, ); markdown += &generate_markdown_list_for_top_level_subitems( &self.enums.iter().collect_vec(), - "Enums", header_level + 1, ); markdown += &generate_markdown_list_for_top_level_subitems( &self.type_aliases.iter().collect_vec(), - "Type aliases", header_level + 1, ); markdown += &generate_markdown_list_for_top_level_subitems( &self.impl_aliases.iter().collect_vec(), - "Impl aliases", header_level + 1, ); markdown += &generate_markdown_list_for_top_level_subitems( &self.traits.iter().collect_vec(), - "Traits", header_level + 1, ); markdown += &generate_markdown_list_for_top_level_subitems( &self.impls.iter().collect_vec(), - "Impls", header_level + 1, ); markdown += &generate_markdown_list_for_top_level_subitems( &self.extern_types.iter().collect_vec(), - "Extern types", header_level + 1, ); markdown += &generate_markdown_list_for_top_level_subitems( &self.extern_functions.iter().collect_vec(), - "Extern functions", header_level + 1, ); @@ -125,7 +135,7 @@ impl MarkdownDocItem for Struct { fn generate_markdown(&self, header_level: usize) -> String { let mut markdown = generate_markdown_from_item_data(self, header_level); - markdown += &generate_markdown_for_subitems(&self.members, "Members", header_level); + markdown += &generate_markdown_for_subitems(&self.members, header_level); markdown } @@ -135,19 +145,16 @@ impl MarkdownDocItem for Trait { fn generate_markdown(&self, header_level: usize) -> String { let mut markdown = generate_markdown_from_item_data(self, header_level); - markdown += - &generate_markdown_for_subitems(&self.trait_constants, "Trait Constants", header_level); - markdown += - &generate_markdown_for_subitems(&self.trait_functions, "Trait Functions", header_level); - markdown += &generate_markdown_for_subitems(&self.trait_types, "Trait Types", header_level); + markdown += &generate_markdown_for_subitems(&self.trait_constants, header_level); + markdown += &generate_markdown_for_subitems(&self.trait_functions, header_level); + markdown += &generate_markdown_for_subitems(&self.trait_types, header_level); markdown } } -pub fn generate_markdown_list_for_top_level_subitems( - subitems: &[&impl TopLevelMarkdownDocItem], - name: &str, +pub fn generate_markdown_list_for_top_level_subitems( + subitems: &[&T], header_level: usize, ) -> String { let mut markdown = String::new(); @@ -155,7 +162,7 @@ pub fn generate_markdown_list_for_top_level_subitems( if !subitems.is_empty() { let header = str::repeat("#", header_level); - writeln!(&mut markdown, "{header} {name}\n").unwrap(); + writeln!(&mut markdown, "{header} {}\n", T::HEADER).unwrap(); for item in subitems { writeln!(&mut markdown, "{}", item.generate_markdown_list_item()).unwrap(); } @@ -164,9 +171,8 @@ pub fn generate_markdown_list_for_top_level_subitems( markdown } -fn generate_markdown_for_subitems( - subitems: &[impl MarkdownDocItem + PrimitiveDocItem], - name: &str, +fn generate_markdown_for_subitems( + subitems: &[T], header_level: usize, ) -> String { let mut markdown = String::new(); @@ -174,7 +180,7 @@ fn generate_markdown_for_subitems( if !subitems.is_empty() { let header = str::repeat("#", header_level + 1); - writeln!(&mut markdown, "{header} {name}\n").unwrap(); + writeln!(&mut markdown, "{header} {}\n", T::HEADER).unwrap(); for item in subitems { writeln!( &mut markdown, @@ -188,7 +194,7 @@ fn generate_markdown_for_subitems( markdown } -fn generate_markdown_from_item_data(doc_item: &dyn DocItem, header_level: usize) -> String { +fn generate_markdown_from_item_data(doc_item: &impl DocItem, header_level: usize) -> String { let mut markdown = String::new(); let header = str::repeat("#", header_level); diff --git a/extensions/scarb-doc/tests/data/hello_world/src/SUMMARY.md b/extensions/scarb-doc/tests/data/hello_world/src/SUMMARY.md index 62426be01..6ff32f1ef 100644 --- a/extensions/scarb-doc/tests/data/hello_world/src/SUMMARY.md +++ b/extensions/scarb-doc/tests/data/hello_world/src/SUMMARY.md @@ -1,46 +1,46 @@ # Summary -# Modules +- [Modules](./modules.md) -- [hello_world](./hello_world.md) + - [hello_world](./hello_world.md) -- [tests](./hello_world-tests.md) + - [tests](./hello_world-tests.md) -# Constants +- [Constants](./constants.md) -- [FOO](./hello_world-FOO.md) + - [FOO](./hello_world-FOO.md) -# Free functions +- [Free functions](./free_functions.md) -- [main](./hello_world-main.md) + - [main](./hello_world-main.md) -- [fib](./hello_world-fib.md) + - [fib](./hello_world-fib.md) -- [it_works](./hello_world-tests-it_works.md) + - [it_works](./hello_world-tests-it_works.md) -# Structs +- [Structs](./structs.md) -- [Circle](./hello_world-Circle.md) + - [Circle](./hello_world-Circle.md) -# Enums +- [Enums](./enums.md) -- [Color](./hello_world-Color.md) + - [Color](./hello_world-Color.md) -# Type Aliases +- [Type aliases](./type_aliases.md) -- [Pair](./hello_world-Pair.md) + - [Pair](./hello_world-Pair.md) -# Traits +- [Traits](./traits.md) -- [Shape](./hello_world-Shape.md) + - [Shape](./hello_world-Shape.md) -# Impls +- [Impls](./impls.md) -- [CircleShape](./hello_world-CircleShape.md) + - [CircleShape](./hello_world-CircleShape.md) -- [CircleDrop](./hello_world-CircleDrop.md) + - [CircleDrop](./hello_world-CircleDrop.md) -- [CircleSerde](./hello_world-CircleSerde.md) + - [CircleSerde](./hello_world-CircleSerde.md) -- [CirclePartialEq](./hello_world-CirclePartialEq.md) + - [CirclePartialEq](./hello_world-CirclePartialEq.md) diff --git a/extensions/scarb-doc/tests/data/hello_world/src/constants.md b/extensions/scarb-doc/tests/data/hello_world/src/constants.md new file mode 100644 index 000000000..07df9a581 --- /dev/null +++ b/extensions/scarb-doc/tests/data/hello_world/src/constants.md @@ -0,0 +1,4 @@ +# Constants + +- [FOO](./hello_world-FOO.md) + diff --git a/extensions/scarb-doc/tests/data/hello_world/src/enums.md b/extensions/scarb-doc/tests/data/hello_world/src/enums.md new file mode 100644 index 000000000..d578fe0e1 --- /dev/null +++ b/extensions/scarb-doc/tests/data/hello_world/src/enums.md @@ -0,0 +1,4 @@ +# Enums + +- [Color](./hello_world-Color.md) + diff --git a/extensions/scarb-doc/tests/data/hello_world/src/free_functions.md b/extensions/scarb-doc/tests/data/hello_world/src/free_functions.md new file mode 100644 index 000000000..e83f0ef37 --- /dev/null +++ b/extensions/scarb-doc/tests/data/hello_world/src/free_functions.md @@ -0,0 +1,8 @@ +# Free functions + +- [main](./hello_world-main.md) + +- [fib](./hello_world-fib.md) + +- [it_works](./hello_world-tests-it_works.md) + diff --git a/extensions/scarb-doc/tests/data/hello_world/src/hello_world-CirclePartialEq.md b/extensions/scarb-doc/tests/data/hello_world/src/hello_world-CirclePartialEq.md index ebfbcbd4d..f22c631b6 100644 --- a/extensions/scarb-doc/tests/data/hello_world/src/hello_world-CirclePartialEq.md +++ b/extensions/scarb-doc/tests/data/hello_world/src/hello_world-CirclePartialEq.md @@ -6,7 +6,7 @@ Fully qualified path: `hello_world::CirclePartialEq` impl CirclePartialEq of core::traits::PartialEq ``` -## Impl Functions +## Impl functions ### eq diff --git a/extensions/scarb-doc/tests/data/hello_world/src/hello_world-CircleSerde.md b/extensions/scarb-doc/tests/data/hello_world/src/hello_world-CircleSerde.md index e13af9513..28f86b2ae 100644 --- a/extensions/scarb-doc/tests/data/hello_world/src/hello_world-CircleSerde.md +++ b/extensions/scarb-doc/tests/data/hello_world/src/hello_world-CircleSerde.md @@ -6,7 +6,7 @@ Fully qualified path: `hello_world::CircleSerde` impl CircleSerde of core::serde::Serde ``` -## Impl Functions +## Impl functions ### serialize diff --git a/extensions/scarb-doc/tests/data/hello_world/src/hello_world-CircleShape.md b/extensions/scarb-doc/tests/data/hello_world/src/hello_world-CircleShape.md index 49da53246..d6997b9ec 100644 --- a/extensions/scarb-doc/tests/data/hello_world/src/hello_world-CircleShape.md +++ b/extensions/scarb-doc/tests/data/hello_world/src/hello_world-CircleShape.md @@ -9,7 +9,7 @@ Fully qualified path: `hello_world::CircleShape` impl CircleShape of Shape ``` -## Impl Constants +## Impl constants ### SHAPE_CONST @@ -23,7 +23,7 @@ const SHAPE_CONST: felt252 = 'xyz'; ``` -## Impl Functions +## Impl functions ### area @@ -37,7 +37,7 @@ fn area(self: Circle) -> u32 ``` -## Impl Types +## Impl types ### ShapePair diff --git a/extensions/scarb-doc/tests/data/hello_world/src/hello_world-Shape.md b/extensions/scarb-doc/tests/data/hello_world/src/hello_world-Shape.md index 3e54488c4..b08696b6f 100644 --- a/extensions/scarb-doc/tests/data/hello_world/src/hello_world-Shape.md +++ b/extensions/scarb-doc/tests/data/hello_world/src/hello_world-Shape.md @@ -9,7 +9,7 @@ Fully qualified path: `hello_world::Shape` trait Shape ``` -## Trait Constants +## Trait constants ### SHAPE_CONST @@ -19,7 +19,7 @@ Constant for the shape type Fully qualified path: `hello_world::Shape::SHAPE_CONST` -## Trait Functions +## Trait functions ### area @@ -33,7 +33,7 @@ fn area(self: T) -> u32 ``` -## Trait Types +## Trait types ### ShapePair diff --git a/extensions/scarb-doc/tests/data/hello_world/src/hello_world-tests-it_works.md b/extensions/scarb-doc/tests/data/hello_world/src/hello_world-tests-it_works.md new file mode 100644 index 000000000..f78d405fe --- /dev/null +++ b/extensions/scarb-doc/tests/data/hello_world/src/hello_world-tests-it_works.md @@ -0,0 +1,12 @@ +# it_works + +Really +works. + + +Fully qualified path: `hello_world::tests::it_works` + +```rust +fn it_works() +``` + diff --git a/extensions/scarb-doc/tests/data/hello_world/src/hello_world-tests.md b/extensions/scarb-doc/tests/data/hello_world/src/hello_world-tests.md new file mode 100644 index 000000000..f72f03ff7 --- /dev/null +++ b/extensions/scarb-doc/tests/data/hello_world/src/hello_world-tests.md @@ -0,0 +1,11 @@ +# tests + +Tests module + + +Fully qualified path: `hello_world::tests` + +## Free functions + +- [it_works](./hello_world-tests-it_works.md) + diff --git a/extensions/scarb-doc/tests/data/hello_world/src/hello_world.md b/extensions/scarb-doc/tests/data/hello_world/src/hello_world.md index f78d405fe..b17728f49 100644 --- a/extensions/scarb-doc/tests/data/hello_world/src/hello_world.md +++ b/extensions/scarb-doc/tests/data/hello_world/src/hello_world.md @@ -1,12 +1,44 @@ -# it_works +# hello_world -Really -works. +Fully qualified path: `hello_world` +## Modules -Fully qualified path: `hello_world::tests::it_works` +- [tests](./hello_world-tests.md) -```rust -fn it_works() -``` +## Constants + +- [FOO](./hello_world-FOO.md) + +## Free functions + +- [main](./hello_world-main.md) + +- [fib](./hello_world-fib.md) + +## Structs + +- [Circle](./hello_world-Circle.md) + +## Enums + +- [Color](./hello_world-Color.md) + +## Type aliases + +- [Pair](./hello_world-Pair.md) + +## Traits + +- [Shape](./hello_world-Shape.md) + +## Impls + +- [CircleShape](./hello_world-CircleShape.md) + +- [CircleDrop](./hello_world-CircleDrop.md) + +- [CircleSerde](./hello_world-CircleSerde.md) + +- [CirclePartialEq](./hello_world-CirclePartialEq.md) diff --git a/extensions/scarb-doc/tests/data/hello_world/src/impls.md b/extensions/scarb-doc/tests/data/hello_world/src/impls.md new file mode 100644 index 000000000..d76703860 --- /dev/null +++ b/extensions/scarb-doc/tests/data/hello_world/src/impls.md @@ -0,0 +1,10 @@ +# Impls + +- [CircleShape](./hello_world-CircleShape.md) + +- [CircleDrop](./hello_world-CircleDrop.md) + +- [CircleSerde](./hello_world-CircleSerde.md) + +- [CirclePartialEq](./hello_world-CirclePartialEq.md) + diff --git a/extensions/scarb-doc/tests/data/hello_world/src/modules.md b/extensions/scarb-doc/tests/data/hello_world/src/modules.md new file mode 100644 index 000000000..72d5f60af --- /dev/null +++ b/extensions/scarb-doc/tests/data/hello_world/src/modules.md @@ -0,0 +1,6 @@ +# Modules + +- [hello_world](./hello_world.md) + +- [tests](./hello_world-tests.md) + diff --git a/extensions/scarb-doc/tests/data/hello_world/src/structs.md b/extensions/scarb-doc/tests/data/hello_world/src/structs.md new file mode 100644 index 000000000..48d05f738 --- /dev/null +++ b/extensions/scarb-doc/tests/data/hello_world/src/structs.md @@ -0,0 +1,4 @@ +# Structs + +- [Circle](./hello_world-Circle.md) + diff --git a/extensions/scarb-doc/tests/data/hello_world/src/traits.md b/extensions/scarb-doc/tests/data/hello_world/src/traits.md new file mode 100644 index 000000000..0e3d7bf72 --- /dev/null +++ b/extensions/scarb-doc/tests/data/hello_world/src/traits.md @@ -0,0 +1,4 @@ +# Traits + +- [Shape](./hello_world-Shape.md) + diff --git a/extensions/scarb-doc/tests/data/hello_world/src/type_aliases.md b/extensions/scarb-doc/tests/data/hello_world/src/type_aliases.md new file mode 100644 index 000000000..f92762406 --- /dev/null +++ b/extensions/scarb-doc/tests/data/hello_world/src/type_aliases.md @@ -0,0 +1,4 @@ +# Type aliases + +- [Pair](./hello_world-Pair.md) +