1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
mod error;
mod generate;
mod helper;
mod module;
mod parse;

#[cfg(feature = "debug")]
mod debug;

use proc_macro::TokenStream;

/// Implement the `Into` trait on this struct.
///
/// `struct.rs`
/// ```rust, ignore
/// use inter_struct::prelude::*;
///
/// pub struct Target {
///     pub test: String,
/// }
///
/// #[derive(StructInto)]
/// #[struct_into(["crate::structs::Target"])]
/// pub struct Test {
///     pub test: String,
/// }
/// ```
#[proc_macro_derive(StructInto, attributes(struct_into))]
pub fn struct_into(struct_ast: TokenStream) -> TokenStream {
    generate::into::struct_into_inner(struct_ast)
}

/// Implement the `Into` trait on this struct with `Default::default` for missing fields.
///
/// `struct.rs`
/// ```rust, ignore
/// use inter_struct::prelude::*;
///
/// pub struct Target {
///     pub test: String,
/// }
///
/// #[derive(StructIntoDefault)]
/// #[struct_into_default(["crate::structs::Target"])]
/// pub struct Test {
///     pub test: String,
/// }
/// ```
///
#[proc_macro_derive(StructIntoDefault, attributes(struct_into_default))]
pub fn struct_into_default(struct_ast: TokenStream) -> TokenStream {
    generate::into::struct_into_default_inner(struct_ast)
}

/// Implement the `StructMerge` trait on this struct.
///
/// `struct.rs`
/// ```rust, ignore
/// use inter_struct::prelude::*;
///
/// pub struct Target {
///     pub test: String,
/// }
///
/// #[derive(StructMerge)]
/// #[struct_merge("crate::structs::Target")]
/// pub struct Test {
///     pub test: String,
/// }
/// ```
#[proc_macro_derive(StructMerge, attributes(struct_merge))]
pub fn struct_merge(struct_ast: TokenStream) -> TokenStream {
    generate::merge::struct_merge_inner(struct_ast)
}

/// Implement the `StructMergeRef` trait on this struct.
///
/// `struct.rs`
/// ```rust, ignore
/// use inter_struct::prelude::*;
///
/// pub struct Target {
///     pub test: String,
/// }
///
/// #[derive(StructMergeRef)]
/// #[struct_merge_ref(["crate::structs::Target"])]
/// pub struct Test {
///     pub test: String,
/// }
/// ```
#[proc_macro_derive(StructMergeRef, attributes(struct_merge_ref))]
pub fn struct_merge_ref(struct_ast: TokenStream) -> TokenStream {
    generate::merge::struct_merge_ref_inner(struct_ast)
}