quick_impl/lib.rs
1#![cfg_attr(not(test), warn(unused_crate_dependencies))]
2#![doc = include_str!("../README.md")]
3
4use proc_macro::TokenStream;
5
6mod attr;
7mod components;
8mod config;
9mod ctx;
10mod expand;
11mod idents;
12mod input;
13mod order;
14mod respan;
15mod tokens;
16mod utils;
17
18/// Quickly generate common methods and trait implementations on enums or structs.
19///
20/// ## Enum example
21/// ```rust
22/// use quick_impl::quick_impl;
23///
24/// #[quick_impl]
25/// enum MyEnum {
26/// #[quick_impl(pub const is, impl Default)]
27/// Variant1,
28/// #[quick_impl(pub as_ref, pub(crate) as_ref_mut, impl From)]
29/// Variant2(i32),
30/// }
31///
32/// let a = MyEnum::default();
33/// assert!(a.is_variant1());
34///
35/// let mut b = MyEnum::from(42);
36/// assert_eq!(*b.as_variant2().unwrap(), 42);
37/// ```
38///
39/// ## Struct example
40/// ```rust
41/// use quick_impl::quick_impl;
42///
43/// #[quick_impl(pub const new)]
44/// struct MyStruct {
45/// #[quick_impl(pub get)]
46/// field1: i32,
47///
48/// #[quick_impl(pub get_mut, impl Into)]
49/// field2: String,
50/// }
51///
52/// let mut instance = MyStruct::new(1, "hello".to_string());
53/// assert_eq!(*instance.get_field1(), 1);
54/// instance.get_field2_mut().push_str(" world");
55/// assert_eq!(&String::from(instance), "hello world");
56/// ```
57#[proc_macro_attribute]
58pub fn quick_impl(args: TokenStream, input: TokenStream) -> TokenStream {
59 expand::expand_qi(args.into(), input.into())
60 .unwrap_or_else(|err| err.to_compile_error())
61 .into()
62}
63
64/// Quickly generate common methods and trait implementations on enums or structs on all the
65/// variants or fields.
66///
67/// [`quick_impl_all`](macro@quick_impl_all) can be combined with [`quick_impl`](macro@quick_impl)
68/// in any order.
69///
70/// ## Enum example
71/// ```rust
72/// use quick_impl::quick_impl_all;
73///
74/// #[quick_impl_all(pub const is)]
75/// enum MyEnum {
76/// Variant1,
77/// #[quick_impl(pub as_ref, impl From)]
78/// Variant2(i32),
79/// }
80///
81/// let a = MyEnum::Variant1;
82/// assert!(a.is_variant1());
83///
84/// let mut b = MyEnum::from(42);
85/// assert!(b.is_variant2());
86/// ```
87///
88/// ## Struct example
89/// ```rust
90/// use quick_impl::quick_impl;
91///
92/// #[quick_impl(pub const new)]
93/// #[quick_impl_all(pub get = "{}", pub get_mut = "{}_mut")]
94/// struct MyStruct {
95/// field1: i32,
96///
97/// #[quick_impl(impl Into)]
98/// field2: String,
99/// }
100///
101/// let mut instance = MyStruct::new(1, "hello".to_string());
102/// assert_eq!(*instance.field1(), 1);
103/// instance.field2_mut().push_str(" world");
104/// assert_eq!(&String::from(instance), "hello world");
105/// ```
106#[proc_macro_attribute]
107pub fn quick_impl_all(args: TokenStream, input: TokenStream) -> TokenStream {
108 expand::expand_qia(args.into(), input.into())
109 .unwrap_or_else(|err| err.to_compile_error())
110 .into()
111}