g_string/macros.rs
1/// Compile-time check for GString without validation.
2///
3/// Validation can only happen at runtime, so this macro returned [`crate::InValidatedGString`] needed to be validated.
4///
5/// It's only useful for checking bounds and ASCII statically at compile-time.
6///
7/// # Examples
8///
9/// ```rust
10/// use g_string::gstring;
11///
12/// let ret = gstring!("aslkdm");
13/// let ret = ret.validate().unwrap();
14/// assert_eq!(ret, "aslkdm");
15///
16/// // let ret = gstring!("aslkdm", (), 2, 4); // won't even compile
17/// ```
18#[macro_export]
19macro_rules! gstring {
20 ($s:literal) => {
21 gstring!(
22 $s,
23 $crate::NoValidation,
24 { $crate::DEFAULT_MIN },
25 { $crate::DEFAULT_MAX },
26 { $crate::DEFAULT_ASCII_ONLY }
27 )
28 };
29 ($s:literal, $validator:ty) => {
30 gstring!(
31 $s,
32 $validator,
33 { $crate::DEFAULT_MIN },
34 { $crate::DEFAULT_MAX },
35 { $crate::DEFAULT_ASCII_ONLY }
36 )
37 };
38 ($s:literal, $validator:ty, $min:expr) => {
39 gstring!($s, $validator, $min, { $crate::DEFAULT_MAX }, {
40 $crate::DEFAULT_ASCII_ONLY
41 })
42 };
43 ($s:literal, $validator:ty, $min:expr, $max:expr) => {
44 gstring!($s, $validator, $min, $max, { $crate::DEFAULT_ASCII_ONLY })
45 };
46 ($s:literal, $validator:ty, $min:expr, $max:expr, $ascii_only:expr) => {{
47 const RET: $crate::InValidatedGString<$validator, $min, $max, $ascii_only> =
48 $crate::GString::<$validator, $min, $max, $ascii_only>::new($s);
49 RET
50 }};
51}
52
53/// `gformat` formats string like stdlib's `format!` does, with generic/config params pluggable.
54///
55/// # Examples
56/// ```rust
57/// use g_string::gformat;
58///
59/// let ret = gformat!("--> {} - {} equals to {}", 5, 2, "three"; (), 2, 100, true).unwrap();
60/// assert_eq!(ret, "--> 5 - 2 equals to three");
61///
62/// let ret = gformat!("--> fire: {}", "🔥"; (), 2, 102, true);
63/// assert!(ret.is_err()); // ASCII_ONLY is true
64/// ```
65#[macro_export]
66macro_rules! gformat {
67 // -----------------------------------------------------------------------------
68 // DEFAULT GENERICS
69 // -----------------------------------------------------------------------------
70 ($fmt:expr $(, $args:expr)* ) => {
71 gformat!(
72 $fmt $(, $args)* ;
73 $crate::NoValidation,
74 { $crate::DEFAULT_MIN },
75 { $crate::DEFAULT_MAX },
76 { $crate::DEFAULT_ASCII_ONLY }
77 )
78 };
79
80 // -----------------------------------------------------------------------------
81 // VALIDATOR ONLY
82 // -----------------------------------------------------------------------------
83 ($fmt:expr $(, $args:expr)* ; $validator:ty) => {
84 gformat!(
85 $fmt $(, $args)* ;
86 $validator,
87 { $crate::DEFAULT_MIN },
88 { $crate::DEFAULT_MAX },
89 { $crate::DEFAULT_ASCII_ONLY }
90 )
91 };
92
93 // -----------------------------------------------------------------------------
94 // VALIDATOR + MIN
95 // -----------------------------------------------------------------------------
96 ($fmt:expr $(, $args:expr)* ; $validator:ty, $min:expr) => {
97 gformat!(
98 $fmt $(, $args)* ;
99 $validator,
100 $min,
101 { $crate::DEFAULT_MAX },
102 { $crate::DEFAULT_ASCII_ONLY }
103 )
104 };
105
106 // -----------------------------------------------------------------------------
107 // VALIDATOR + MIN + MAX
108 // -----------------------------------------------------------------------------
109 ($fmt:expr $(, $args:expr)* ; $validator:ty, $min:expr, $max:expr) => {
110 gformat!(
111 $fmt $(, $args)* ;
112 $validator,
113 $min,
114 $max,
115 { $crate::DEFAULT_ASCII_ONLY }
116 )
117 };
118
119 // -----------------------------------------------------------------------------
120 // FULL FORM
121 // -----------------------------------------------------------------------------
122 (
123 $fmt:expr $(, $args:expr)* ;
124 $validator:ty,
125 $min:expr,
126 $max:expr,
127 $ascii_only:expr
128 ) => {{
129 #[cfg(feature = "alloc")]
130 {
131 let s = format!($fmt $(, $args)*);
132
133 $crate::GString::<
134 $validator,
135 $min,
136 $max,
137 $ascii_only
138 >::try_new(&s)
139 }
140
141 #[cfg(not(feature = "alloc"))]
142 compile_error!(
143 "gformat! requires the `alloc` feature"
144 );
145 }};
146}