metron_core/macros/
unit.rs

1
2#[macro_export]
3macro_rules! def_unit {
4    ( $vis:vis $unit_name:ident; ) => {
5        $vis struct $unit_name;
6        impl $crate::unit::Unit for $unit_name {}
7        impl<N> $crate::convert::FromUnit<N, $unit_name> for $unit_name{
8            type Output = N;
9            fn from_unit(num: N) -> <Self as $crate::convert::FromUnit<N, $unit_name>>::Output { num }
10        }
11    };
12    ( $vis:vis $unit_name:ident {
13        $(from $from_body:tt ,)*
14        // $(into $into_body:tt ,)*
15        $(exp   $exp_body:tt ,)*
16        $(sym   $sym_body:tt ,)?
17        // $(qua   $qua_body:tt ,)?
18        // $(dim   $dim_body:tt ,)?
19    }) => {
20        $crate::def_unit!($vis $unit_name;);
21        $( $crate::impl_unit_from!     ($unit_name, $from_body); )*
22        // $( $crate::impl_unit_into!     ($unit_name, $into_body); )*
23        $( $crate::impl_unit_exp_scale!($unit_name,  $exp_body); )*
24        $( $crate::impl_fmt_symbol!    ($unit_name,  $sym_body); )?
25    };
26
27    ( $vis:vis $scale_name:ident |: $base_unit:ty => $unit_exp_name:ident; ) => {
28        $crate::def_unit!($vis $unit_exp_name;);
29        $crate::impl_unit_exp_scale!($scale_name |: $base_unit => $unit_exp_name);
30    };
31    ( $vis:vis $scale_name:ident |: $base_unit:ty => $unit_exp_name:ident {
32        $(from $from_body:tt ,)*
33        $(sym   $sym_body:tt ,)?
34    } ) => {
35        $crate::def_unit!($vis $scale_name |: $base_unit => $unit_exp_name;);
36        $( $crate::impl_unit_from! ($unit_exp_name, $from_body); )*
37        $( $crate::impl_fmt_symbol!($unit_exp_name,  $sym_body); )?
38    };
39
40    ( $lhs:ty |* $rhs:ty => $vis:vis $mul:ident; ) => {
41        $crate::def_unit!($vis $mul;);
42        $crate::impl_unit_mul!($lhs |* $rhs => $mul);
43    };
44    ( $lhs:ty |* $rhs:ty => $vis:vis $mul:ident {
45        $(from $from_body:tt ,)*
46        $(exp   $exp_body:tt ,)*
47        $(sym   $sym_body:tt ,)?
48    } ) => {
49        $crate::def_unit!($lhs |* $rhs => $vis $mul;);
50        $( $crate::impl_unit_from!     ($mul, $from_body); )*
51        $( $crate::impl_unit_exp_scale!($mul,  $exp_body); )*
52        $( $crate::impl_fmt_symbol!    ($mul,  $sym_body); )?
53    };
54
55    ( $lhs:ty |/ $rhs:ty => $vis:vis $div:ident; ) => {
56        $crate::def_unit!($vis $div;);
57        $crate::impl_unit_div!($lhs |/ $rhs => $div);
58    };
59    ( $lhs:ty |/ $rhs:ty => $vis:vis $div:ident {
60        $(from $from_body:tt ,)*
61        $(exp   $exp_body:tt ,)*
62        $(sym   $sym_body:tt ,)?
63    } ) => {
64        $crate::def_unit!($lhs |/ $rhs => $vis $div;);
65        $( $crate::impl_unit_from!     ($div, $from_body); )*
66        $( $crate::impl_unit_exp_scale!($div,  $exp_body); )*
67        $( $crate::impl_fmt_symbol!    ($div,  $sym_body); )?
68    };
69}
70