Skip to main content

rustidy_util/
config.rs

1//! Formatter configuration
2
3// Imports
4use 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	/// Formatter configuration
24	#[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}