svg/node/element/path/
parameters.rs

1use std::ops::Deref;
2
3use super::Number;
4
5/// Parameters of a command.
6#[derive(Clone, Debug)]
7pub struct Parameters(Vec<Number>);
8
9impl Deref for Parameters {
10    type Target = [Number];
11
12    #[inline]
13    fn deref(&self) -> &Self::Target {
14        &self.0
15    }
16}
17
18impl From<Parameters> for String {
19    fn from(Parameters(inner): Parameters) -> Self {
20        inner
21            .iter()
22            .map(|value| value.to_string())
23            .collect::<Vec<_>>()
24            .join(",")
25    }
26}
27
28impl From<Vec<Number>> for Parameters {
29    #[inline]
30    fn from(inner: Vec<Number>) -> Self {
31        Parameters(inner)
32    }
33}
34
35impl From<Parameters> for Vec<Number> {
36    #[inline]
37    fn from(Parameters(inner): Parameters) -> Self {
38        inner
39    }
40}
41
42impl<'l> From<&'l mut Parameters> for &'l mut Vec<Number> {
43    #[inline]
44    fn from(Parameters(inner): &'l mut Parameters) -> Self {
45        inner
46    }
47}
48
49macro_rules! implement {
50    ($($primitive:ty,)*) => (
51        $(impl From<$primitive> for Parameters {
52            #[inline]
53            fn from(inner: $primitive) -> Self {
54                Parameters(vec![inner as Number])
55            }
56        })*
57    );
58}
59
60implement! {
61    i8, i16, i32, i64, isize,
62    u8, u16, u32, u64, usize,
63    f32, f64,
64}
65
66macro_rules! implement {
67    (@express $e:expr) => ($e);
68    ($(($t:ident, $n:tt)),*) => (
69        impl<$($t),*> From<($($t),*)> for Parameters
70        where
71            $($t: Into<Parameters>),*
72        {
73            fn from(inner: ($($t),*)) -> Self {
74                let mut result = vec![];
75                $(result.append(&mut implement!(@express inner.$n).into().into());)*
76                Parameters(result)
77            }
78        }
79    );
80}
81
82implement! { (T0, 0), (T1, 1) }
83implement! { (T0, 0), (T1, 1), (T2, 2) }
84implement! { (T0, 0), (T1, 1), (T2, 2), (T3, 3) }
85implement! { (T0, 0), (T1, 1), (T2, 2), (T3, 3), (T4, 4) }
86implement! { (T0, 0), (T1, 1), (T2, 2), (T3, 3), (T4, 4), (T5, 5) }
87implement! { (T0, 0), (T1, 1), (T2, 2), (T3, 3), (T4, 4), (T5, 5), (T6, 6) }
88implement! { (T0, 0), (T1, 1), (T2, 2), (T3, 3), (T4, 4), (T5, 5), (T6, 6), (T7, 7) }