#[doc(hidden)]
#[macro_export]
macro_rules! stringlet_base {
(param$params:tt : $($rest:tt)+) => {
$crate::stringlet_base!(size$params $($rest)+)
};
(param($kind:tt) $size:tt: $($rest:tt)+) => {
$crate::stringlet_base!($crate::$kind<$size>: $($rest)+)
};
(size($kind:tt) [$str:expr $(, $strn:expr)*]) => {
$crate::stringlet_base!($crate::$kind<{ ($str).len() }>: [$str $(, $strn)*])
};
(size($kind:tt) $str:expr) => {
$crate::stringlet_base!($crate::$kind<{ ($str).len() }>: $str)
};
(size($kind:tt $size:tt) $str:expr) => {
$crate::stringlet_base!($crate::$kind<$size>: $str)
};
($slet:ty: [$($str:expr),+]) => {
[$(
<$slet>::_from_macro($str)
),+]
};
($slet:ty: $str:expr) => {
<$slet>::_from_macro($str)
};
}
#[macro_export]
macro_rules! stringlet {
(_: $($rest:tt)+) => {
$crate::stringlet_base!($crate::StringletBase::<_, _, _>: $($rest)+)
};
(trim $($rest:tt)+) => {
$crate::stringlet_base!(param(TrimStringlet) $($rest)+)
};
(t $($rest:tt)+) => {
$crate::stringlet!(trim $($rest)+)
};
(var $($rest:tt)+) => {
$crate::stringlet_base!(param(VarStringlet) $($rest)+)
};
(v $($rest:tt)+) => {
$crate::stringlet!(var $($rest)+)
};
(slim $($rest:tt)+) => {
$crate::stringlet_base!(param(SlimStringlet) $($rest)+)
};
(s $($rest:tt)+) => {
$crate::stringlet!(slim $($rest)+)
};
($size:tt: $($rest:tt)+) => {
$crate::stringlet_base!($crate::Stringlet<$size>: $($rest)+)
};
($($rest:tt)+) => {
$crate::stringlet_base!(size(Stringlet) $($rest)+)
};
}
#[cfg(doctest)]
mod doctests {
fn test_macro_var_256_compile_fail() {}
fn test_macro_slim_65_compile_fail() {} }
#[cfg(test)]
mod tests {
fn cmp<Slet: std::fmt::Debug>(slet: Slet, str: &str) {
assert_eq!(format!("{:?}", slet), str);
}
#[test]
fn test_all_types() {
cmp(stringlet!("aha"), "Stringlet<3> { str: \"aha\" }");
cmp(stringlet!(var: "aha"), "VarStringlet<3> { str: \"aha\" }");
cmp(stringlet!(trim: "aha"), "TrimStringlet<3> { str: \"aha\" }");
cmp(stringlet!(slim: "aha"), "SlimStringlet<3> { str: \"aha\" }");
cmp(stringlet!(5: "aha45"), "Stringlet<5> { str: \"aha45\" }");
cmp(stringlet!(var 5: "aha"), "VarStringlet<5> { str: \"aha\" }");
cmp(
stringlet!(trim 4: "aha"),
"TrimStringlet<4> { str: \"aha\" }",
);
cmp(
stringlet!(slim 5: "aha"),
"SlimStringlet<5> { str: \"aha\" }",
);
cmp(
stringlet!(["aha", "oho"]),
"[Stringlet<3> { str: \"aha\" }, Stringlet<3> { str: \"oho\" }]",
);
cmp(
stringlet!(var: ["aha", "oh"]),
"[VarStringlet<3> { str: \"aha\" }, VarStringlet<3> { str: \"oh\" }]",
);
cmp(
stringlet!(trim: ["aha", "oh"]),
"[TrimStringlet<3> { str: \"aha\" }, TrimStringlet<3> { str: \"oh\" }]",
);
cmp(
stringlet!(slim: ["aha", "oh"]),
"[SlimStringlet<3> { str: \"aha\" }, SlimStringlet<3> { str: \"oh\" }]",
);
cmp(
stringlet!(3: ["aha", "oho"]),
"[Stringlet<3> { str: \"aha\" }, Stringlet<3> { str: \"oho\" }]",
);
cmp(
stringlet!(var 5: ["aha", "oh"]),
"[VarStringlet<5> { str: \"aha\" }, VarStringlet<5> { str: \"oh\" }]",
);
cmp(
stringlet!(trim 4: ["aha", "oho"]),
"[TrimStringlet<4> { str: \"aha\" }, TrimStringlet<4> { str: \"oho\" }]",
);
cmp(
stringlet!(slim 5: ["aha", "oh"]),
"[SlimStringlet<5> { str: \"aha\" }, SlimStringlet<5> { str: \"oh\" }]",
);
}
}