polyquine 0.0.8

Teach Rust types to codegen their own constructors
Documentation
use quote::quote;

#[test]
fn ui() {
    let t = trybuild::TestCases::new();
    t.compile_fail("tests/ui/fail/*.rs");
    t.pass("tests/ui/succeed/*.rs");

    use polyquine::Quine;

    mod private {
        use polyquine::Quine;

        #[derive(Quine)]
        #[path_prefix(some_module)]
        pub struct SomeStruct {
            pub value: String,
        }
    }

    pub mod some_module {}
    let mut temp_dir = tempfile::tempdir().unwrap();
    temp_dir.disable_cleanup(true);
    let mod_file = temp_dir.path().join("mod.rs");
    let mod_contents = stringify!(
        mod constructor;
        mod private {
            use polyquine::Quine;

            #[derive(Quine)]
            #[path_prefix(crate::some_module)]
            pub struct SomeStruct {
                pub value: String,
            }
        }
        pub mod some_module {
            pub use crate::private::SomeStruct;
        }
        fn main() {}
    );
    std::fs::write(&mod_file, mod_contents).unwrap();

    let generated_file = temp_dir.path().join("constructor.rs");

    let tokens = private::SomeStruct {
        value: "Hello".to_string(),
    }
    .ctor_tokens();

    let content = quote! {
        use super::*;
        fn nope() {
            let s = #tokens;
            assert_eq!(s.value, "Hello".to_string());
        }
    };

    std::fs::write(&generated_file, content.to_string()).unwrap();

    t.pass(mod_file);
}