1use std::sync::Arc;
5
6decl_config! {
7 Config;
8
9 indent : Arc<str> = Arc::from("\t"),
10 skip : bool = false,
11 min_empty_lines : usize = 0,
12 max_empty_lines : usize = 2,
13 max_use_tree_len : usize = 75,
14 array_expr_cols : Option<usize> = None,
15 max_array_expr_len : usize = 80,
16 max_chain_len : usize = 50,
17 max_inline_tuple_struct_len: usize = 80,
18}
19
20macro decl_config(
21 $Config:ident; $($field:ident : $T:ty = $default:expr),* $(,)?
22) {
23 #[derive(Clone, Debug)]
25 pub struct $Config {
26 $(
27 pub $field: $T,
28 )*
29 }
30
31 impl Default for $Config {
32 fn default() -> Self {
33 Self {
34 $(
35 $field: $default,
36 )*
37 }
38 }
39 }
40
41 impl serde::Serialize for Config {
42 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
43 where
44 S: serde::Serializer
45 {
46 #[derive(serde::Serialize)]
47 struct ${ concat($Config, Repr) }<'a> {
48 $(
49 $field: Option<&'a $T>,
50 )*
51 }
52
53 let repr = ${ concat($Config, Repr) } {
54 $(
55 $field: (self.$field != $default).then(|| &self.$field),
56 )*
57 };
58
59 repr.serialize(serializer)
60 }
61 }
62
63 impl<'de> serde::Deserialize<'de> for Config {
64 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
65 where
66 D: serde::Deserializer<'de>
67 {
68 #[derive(serde::Deserialize)]
69 struct ${ concat($Config, Repr) } {
70 $(
71 $field: Option<$T>,
72 )*
73 }
74
75 let repr = ${ concat($Config, Repr) }::deserialize(deserializer)?;
76
77 Ok(Self {
78 $(
79 $field: repr.$field.unwrap_or_else(|| $default),
80 )*
81 })
82
83 }
84 }
85}