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 {}