1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
#![feature(let_chains)]
#![feature(pattern)]
mod control_str;
mod tildes;
pub use control_str::*;
pub use tildes::*;
/// multi_tilde_impl!(TildeKindVa, [float, char, String], self, {Err("un-implenmented yet".into())})
///
/// will expand
///
/// impl TildeKindVa for float {
/// fn format(&self, tkind: &TildeKind) -> Result<String, Box<dyn std::error::Error>> {
/// Err("un-implenmented yet".into())
/// }
/// }
/// ...
#[macro_export]
macro_rules! multi_tilde_impl {
($implName:ident, [$($y:ident),+], $s:ident, $buf:ident, $body:block) => {
$(
impl $implName for $y {
fn format(&$s, _: &TildeKind, $buf: &mut String) -> Result<(), TildeError>
$body
}
)+
};
}
/// add the &dyn TildeAble to the expr
#[macro_export]
macro_rules! tilde {
($arg:expr) => {
$arg as &dyn crate::TildeAble
};
}
/// cl_format! should like vec! macro
///
/// cl_format!(control_str, &a, &b, &c) => {
/// let c = control_str::ControlStr::from("~a, ~a, ~a")?;
/// let a = Into::<
/// tildes::Args<'_>,
/// >::into([
/// &1 as &dyn tildes::TildeAble,
/// &2 as &dyn tildes::TildeAble,
/// &3 as &dyn tildes::TildeAble,
/// ]);
/// c.reveal(a)
/// }
#[macro_export]
macro_rules! cl_format {
($control_str:expr) => {
{
let c = crate::ControlStr::from($control_str).expect("making control string has issue");
let a = crate::Args::new(vec![]);
c.reveal(a)
}
};
($control_str:expr, $($ele:expr),*) => {
{
let c = crate::ControlStr::from($control_str).expect("making control string has issue");
let a = Into::<crate::Args<'_>>::into([$(tilde!($ele)),*]);
c.reveal(a)
}
}
}
#[cfg(test)]
mod tests {}