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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#[macro_export]
macro_rules! name_type {
    ($ident:ident) => {
        #[derive(
            Debug,
            PartialEq,
            Eq,
            Clone,
            Copy,
            Default,
            Hash,
            PartialOrd,
            Ord,
            crate::bytes::Read,
            crate::bytes::Write,
            crate::bytes::NumBytes,
        )]
        #[eosio(crate_path = "crate::bytes")]
        pub struct $ident($crate::name::Name);

        impl $ident {
            #[must_use]
            pub const fn new(value: u64) -> Self {
                Self($crate::name::Name::new(value))
            }

            #[must_use]
            pub const fn as_u64(&self) -> u64 {
                self.0.as_u64()
            }

            #[must_use]
            pub const fn as_name(&self) -> $crate::name::Name {
                self.0
            }
        }

        impl core::ops::Deref for $ident {
            type Target = $crate::name::Name;

            #[must_use]
            fn deref(&self) -> &Self::Target {
                &self.0
            }
        }

        impl core::convert::AsRef<$crate::name::Name> for $ident {
            #[must_use]
            fn as_ref(&self) -> &$crate::name::Name {
                &self.0
            }
        }

        impl core::convert::AsRef<$ident> for $ident {
            #[must_use]
            fn as_ref(&self) -> &Self {
                self
            }
        }

        impl From<u64> for $ident {
            #[must_use]
            fn from(value: u64) -> Self {
                Self::new(value)
            }
        }

        impl From<$ident> for u64 {
            #[must_use]
            fn from(value: $ident) -> Self {
                value.as_u64()
            }
        }

        impl From<$crate::name::Name> for $ident {
            #[must_use]
            fn from(value: $crate::name::Name) -> Self {
                Self(value)
            }
        }

        impl From<$ident> for $crate::name::Name {
            #[must_use]
            fn from(value: $ident) -> Self {
                value.as_name()
            }
        }

        impl core::str::FromStr for $ident {
            type Err = $crate::name::ParseNameError;

            #[inline]
            fn from_str(s: &str) -> Result<Self, Self::Err> {
                let name = $crate::name::Name::from_str(s)?;
                Ok(Self(name))
            }
        }
    };
}