metron_core/macros/
unit.rs1
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 $(exp $exp_body:tt ,)*
16 $(sym $sym_body:tt ,)?
17 }) => {
20 $crate::def_unit!($vis $unit_name;);
21 $( $crate::impl_unit_from! ($unit_name, $from_body); )*
22 $( $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