Skip to main content

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}