# Dismantler [github](https://github.com/viktorlott/typed) [crates.io](https://crates.io/crates/dismantle) `Dismantler` is a procedural macro that is used for disassembling `structs` and `fns` into their inner `type` components that are then accompanied with documentation and examples. The `Dismantler` structures will be wrapped into a module and reassigned with a name (default `core`), this also goes for the `static` and `generic` fields. #### **Project is still under development** ## Examples ```toml [dependencies] dismantler = "0.0.1" ``` ```rust use dismantler::dismantle; #[dismantle] struct Container { a: i32, b: Vec, c: Vec, d: C, e: T } #[dismantle] struct Tuple(i32, i32); #[dismantle] struct Tuple2(i32, T); fn main() { let a: Container::a = 10; let b: Container::b = vec![a]; let c: Container::c = vec![10]; let c: as Container::protocol>::c = c; let d: as Container::protocol>::d = 10; let container: Container::core = Container::core { a, b, c, d, e: 10 }; assert!(container.a == a); } ``` ### More examples ```rust use dismantler::dismantle; #[dismantle] struct Containter { current: u8, buffer: Vec, another: T, } #[dismantle] struct Area(i32); ``` - Will let you access the struct types as followed: ```rust let current: Container::current = 10; let buffer: Container::buffer = vec![current]; let another: as Container::protocol>::another = 20; let container: Container::core = Container::core { current, buffer, another }; ``` - It's also possible to use it as following: ```rust trait Trait: Container::protocol { fn retrieve(&self) -> Container::protocol::buffer; fn extend(&mut self, val: Container::protocol::another); } ``` ### Current support: - [x] **Struct** — `static` and `generic` types - [ ] **Function** — `static` and `generic` types ### Disassembler ```rust #[dismantle] struct #name { #(#ident: #ty)* } // Turns into #[allow(non_snake_case)] // Docs (/w examples) describing the original `item` and also what `types` are available to use. #[doc = #docs] pub mod #name { #![allow(non_camel_case_types)] // The static fields of the `item` as type aliases. #(#ty_decls)* // Access through `#name::#field` // A trait where all `ìtem` fields are associated types #struct_generic // Access through `#name::gen` // Docs (/w examples) describing the original `item`. #[doc = #docs] // The original `ìtem`. #struct_original // Access through `#name::core` } ``` ### Future plans #### Renaming disassembler ```rust use dismantler::dismantle; #[dismantle = "MContainer"] struct Containter { current: u8, buffer: Vec, another: T, } fn main() { let x: Container = { current: 10, buffer: Vec::default(), another: 20, } let y: MContainer::core = x; } ```