kozo provides some syntax sugars to use Rust's struct easily.\ Current kozo provides following 2 proc macros:



define!

define! macro enables to define nested structs in a way easy to see.

```rs use kozo::define;

define!(struct NestedStruct { a: Vec, b: struct B { c: struct C { d: u8, e: u8, }, f: enum F { X, Y, Other { name: String, id: usize }, }, }, });

fn main() { let sample = NestedStruct { a: vec![1, 1, 0, 1, 0, 1, 1], b: B { c: C { d: 0, e: 1, }, f: F::X, }, };

println!("{}", sample.b.c.d);  // 0

} ``` ( examples/define_sample.rs )


Then, define! is just a syntax sugar of defining each named structs separately like

rs struct DeepNestedStruct { a: Vec<u8>, b: B, } struct B { c: C, f: F, } struct C { d: u8, e: u8, } enum F { X, Y, Other { name: String, id: usize, }, } So please pay attension to that all structs declared in define!(); are visible in its scope.



retrieve!

retrieve! enables to simply get more than 1 value from a struct:

```rs use kozo::{define, retrieve};

define!(struct Sample { a: u8, b: struct B { c: String, d: Vec, }, });

fn main() { let s = Sample { a: 0, b: B { c: "I have an apple?".into(), d: vec![1, 1, 0, 1, 0, 1, 1], }, }; retrieve!(a, b from s);

println!("{a}");  // 0,
println!("{}", b.c);

} ``` ( examples/retrieve_sample.rs )



NOTICEs

In next version (v0.2),

```rs

[derive(Clone)]

define!(struct S { // ... }) ```

rs let s = Sample { a: 0, b: B { c: "You have an apple!".into(), d: vec![1, 1, 0, 1, 0, 1, 1,], }, }; retrieve!(a, c(b), from s);


In future, retrieve! will support named retrieving:

```rs let s = Sample { a: 0, b: B { c: "Is this an apple?".into(), d: vec![1, 1, 0, 1, 0, 1, 1,], }, }; retrieve!(var1 @ a, crazyappleman @ c(b), from s);

println!("{var1}"); // 0 ```


for Japanese speakers...\ "kozo" は「小僧」の発音で読んでください。struct「構造」と掛けたネーミングで、構造体に関する小さく便利な機能を提供するクレートという意味を込めています。