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()).unwrap_or_else(|err| err.to_compile_error()).into()
60}
61
62/// Quickly generate common methods and trait implementations on enums or structs on all the
63/// variants or fields.
64///
65/// [`quick_impl_all`](macro@quick_impl_all) can be combined with [`quick_impl`](macro@quick_impl)
66/// in any order.
67///
68/// ## Enum example
69/// ```rust
70/// use quick_impl::quick_impl_all;
71///
72/// #[quick_impl_all(pub const is)]
73/// enum MyEnum {
74/// Variant1,
75/// #[quick_impl(pub as_ref, impl From)]
76/// Variant2(i32),
77/// }
78///
79/// let a = MyEnum::Variant1;
80/// assert!(a.is_variant1());
81///
82/// let mut b = MyEnum::from(42);
83/// assert!(b.is_variant2());
84/// ```
85///
86/// ## Struct example
87/// ```rust
88/// use quick_impl::quick_impl;
89///
90/// #[quick_impl(pub const new)]
91/// #[quick_impl_all(pub get = "{}", pub get_mut = "{}_mut")]
92/// struct MyStruct {
93/// field1: i32,
94///
95/// #[quick_impl(impl Into)]
96/// field2: String,
97/// }
98///
99/// let mut instance = MyStruct::new(1, "hello".to_string());
100/// assert_eq!(*instance.field1(), 1);
101/// instance.field2_mut().push_str(" world");
102/// assert_eq!(&String::from(instance), "hello world");
103/// ```
104#[proc_macro_attribute]
105pub fn quick_impl_all(args: TokenStream, input: TokenStream) -> TokenStream {
106 expand::expand_qia(args.into(), input.into())
107 .unwrap_or_else(|err| err.to_compile_error())
108 .into()
109}