Skip to main content

bullet_exchange_interface/
macros.rs

1/// Define a structure with a set of default derives.
2#[macro_export]
3macro_rules! define_struct {
4    ($(#[$structmeta:meta])* struct $type_name:ident$(<$a:ident>)?{$($(#[$meta:meta])*$name:ident : $type:ty),* $(,)?}) => {
5        #[derive(
6            Clone,
7            Debug,
8            Eq,
9            Hash,
10            Ord,
11            PartialEq,
12            PartialOrd,
13            borsh::BorshDeserialize,
14            borsh::BorshSerialize,
15            schemars::JsonSchema,
16            serde::Deserialize,
17            serde::Serialize,
18        )]
19        #[cfg_attr(feature="schema", derive(sov_universal_wallet::UniversalWallet))]
20        $(#[$structmeta])*
21        pub struct $type_name$(<$a>)* {
22            $($(#[$meta])*
23              pub $name : $type),*
24        }
25    };
26}
27
28#[macro_export]
29macro_rules! define_simple_type {
30    ($(#[$enummeta:meta])* $name:ident($inner:ty)) => {
31        define_simple_type!(
32            $(#[$enummeta])*
33		#[cfg_attr(feature="schema", derive(sov_universal_wallet::UniversalWallet))]
34                $name($inner) + Default + Debug);
35        impl std::fmt::Display for $name {
36            fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
37                write!(f, "{}", self.0)
38            }
39        }
40        impl Copy for $name {}
41        impl std::str::FromStr for $name {
42            type Err = $crate::error::ConfigError;
43
44            fn from_str(s: &str) -> Result<Self, Self::Err> {
45                let id = s
46                    .parse()
47                    .map_err(|_| $crate::error::ConfigError::FailedToParseInput {
48                        input: s.to_string(),
49                        reason: format!("Provided string value for {} cannot be converted to the underlying type ({})", stringify!($type_name), stringify!($inner)),
50                    })?;
51
52                Ok($name(id))
53            }
54        }
55    };
56    ($(#[$enummeta:meta])* $name:ident($(#[$innermeta:meta])* $inner:ty) $(+ $derive:path)*) => {
57        #[derive(
58            Clone,
59            Eq,
60            Hash,
61            Ord,
62            PartialEq,
63            PartialOrd,
64            borsh::BorshDeserialize,
65            borsh::BorshSerialize,
66            schemars::JsonSchema,
67            serde::Deserialize,
68            serde::Serialize,
69            $($derive),*
70        )]
71        #[serde(transparent)]
72        $(#[$enummeta])*
73        pub struct $name(
74	    $(#[$innermeta])*
75	    pub $inner);
76    };
77}
78
79#[macro_export]
80macro_rules! define_simple_enum {
81    ($(#[$enummeta:meta])* $type_name:ident{$($(#[$meta:meta])* $name:ident $(= $value:literal)?),*$(,)?}) => {
82        $crate::define_enum!(
83            $(#[$enummeta])*
84            #[derive(Copy, strum::Display, strum::FromRepr)]
85            enum $type_name{$($(#[$meta])* $name $(= $value)*),*});
86    }
87}
88
89#[macro_export]
90macro_rules! define_enum {
91    ($(#[$enummeta:meta])* enum $type_name:ident $(<$a:ident>)?{$($(#[$meta:meta])*$name:ident $({$($arg_name:ident: $arg_type1:ty),*$(,)?})? $(($($arg_type2:ty),*))? $(= $value:literal)?),+$(,)?}) => {
92        $(#[$enummeta])*
93        #[derive(
94            Clone,
95            Debug,
96            Eq,
97            Hash,
98            Ord,
99            PartialEq,
100            PartialOrd,
101            borsh::BorshDeserialize,
102            borsh::BorshSerialize,
103            serde::Deserialize,
104            serde::Serialize,
105            schemars::JsonSchema,
106            strum::AsRefStr,
107        )]
108	#[cfg_attr(feature="schema", derive(sov_universal_wallet::UniversalWallet))]
109	#[derive(strum::EnumDiscriminants)]
110	#[strum_discriminants(derive(strum::EnumIter, strum::EnumString, strum::Display))]
111        #[repr(u8)]
112        #[serde(rename_all = "snake_case")]
113        #[borsh(use_discriminant = true)]
114        pub enum $type_name$(<$a>)* {
115            $($(#[$meta])*
116              $name $({$($arg_name: $arg_type1),* })* $(($($arg_type2),*))* $(= $value)*),*
117        }
118    }
119}