#[macro_export(local_inner_macros)]
#[cfg_attr(not(feature = "sets"), doc = "```ignore")]
#[cfg_attr(not(feature = "sets"), doc = "```ignore")]
macro_rules! edn {
($($edn:tt)+) => {
edn_internal!($($edn)+)
};
}
#[macro_export(local_inner_macros)]
#[doc(hidden)]
macro_rules! edn_internal {
() => {};
(@seq @vec [$($elems:expr_2021,)*]) => {
std::vec![$($elems,)*]
};
(@seq @list [$($elems:expr_2021,)*]) => {
std::vec![$($elems,)*]
};
(@seq @set [$($elems:expr_2021,)*]) => {
set!{$($elems,)*}
};
(@seq @map [$($key:expr_2021, $val:expr_2021,)*]) => {
map!{$(std::format!("{}", $key) => $val),*}
};
(@seq @$kind:ident [$($elems:expr_2021,)*] , $($rest:tt)*) => {
edn_internal!(@seq @$kind [ $($elems,)* ] $($rest)*)
};
(@seq @$kind:ident [$($elems:expr_2021,)*] :$head:tt $($rest:tt)*) => {
edn_internal!(@seq @$kind [ $($elems,)* edn!(:$head) , ] $($rest)*)
};
(@seq @$kind:ident [$($elems:expr_2021,)*] $num:tt/$den:tt $($rest:tt)*) => {
edn_internal!(@seq @$kind [ $($elems,)* edn!($num/$den) , ] $($rest)*)
};
(@seq @$kind:ident [$($elems:expr_2021,)*] $head:tt $($rest:tt)*) => {
edn_internal!(@seq @$kind [ $($elems,)* edn!($head) , ] $($rest)*)
};
(@seq @$kind:ident [$($elems:expr_2021,)* $open:ident $($inner_val:tt)* $close:ident] $($rest:tt)*) => {{
match (&format!("{:?}",$open), &format!("{:?}",$close)) {
("#{","}") => edn_internal!(@seq @$kind [ $($elems,)* edn_internal!(@seq @set [$($inner_val)*]) , ] $($rest)*),
("(",")") => edn_internal!(@seq @$kind [ $($elems,)* edn_internal!(@seq @list [$($inner_val)*]) , ] $($rest)*),
("[","]") => edn_internal!(@seq @$kind [ $($elems,)* edn_internal!(@seq @vec [$($inner_val)*]) , ] $($rest)*),
}
}};
(null) => {
Edn::Nil
};
(nil) => {
Edn::Nil
};
(true) => {
Edn::Bool(true)
};
(false) => {
Edn::Bool(false)
};
($num:tt/$den:tt) => {{
let q = std::format!("{:?}/{:?}", $num, $den);
Edn::Rational(q)
}};
(:$key:tt) => {{
let k = std::format!(":{}", std::stringify!($key));
Edn::Key(k)
}};
(#{ }) => {
Edn::Set(Set::empty())
};
([]) => {
Edn::Vector(Vector::empty())
};
(()) => {
Edn::List(List::empty())
};
({}) => {
Edn::Map(Map::empty())
};
( ( $($value:tt)* ) ) => {
Edn::List(List::new(edn_internal!(@seq @list [] $($value)*)))
};
( [ $($value:tt)* ] ) => {
Edn::Vector(Vector::new(edn_internal!(@seq @vec [] $($value)*)))
};
( #{ $($value:tt)* } ) => {
Edn::Set(Set::new(edn_internal!(@seq @set [] $($value)*)))
};
( { $($value:tt)* } ) => {
Edn::Map(Map::new(edn_internal!(@seq @map [] $($value)*)))
};
($($sy:ident)-+) => {{
let s: String = std::stringify!($($sy)+).into();
let symbol = s.replace(" ","-");
Edn::Symbol(symbol)
}};
($e:expr_2021) => {
match $crate::edn::utils::Attribute::process(&$e) {
el if el.parse::<i32>().is_ok() => Edn::Int(el.parse::<i64>().unwrap()),
el if el.parse::<i64>().is_ok() => Edn::Int(el.parse::<i64>().unwrap()),
el if el.parse::<u32>().is_ok() => Edn::UInt(el.parse::<u64>().unwrap()),
el if el.parse::<u64>().is_ok() => Edn::UInt(el.parse::<u64>().unwrap()),
el if el.parse::<f32>().is_ok() => Edn::Double(el.parse::<f64>().unwrap().into()),
el if el.parse::<f64>().is_ok() => Edn::Double(el.parse::<f64>().unwrap().into()),
el if el.parse::<bool>().is_ok() => Edn::Bool(el.parse::<bool>().unwrap()),
el => Edn::Str(el)
}
};
}
#[macro_export]
#[doc(hidden)]
macro_rules! edn_unexpected {
() => {};
}
#[macro_export]
macro_rules! map(
{ $($key:expr_2021 => $value:expr_2021),+ } => {
{
extern crate alloc;
let mut m = alloc::collections::BTreeMap::new();
$(
m.insert($key, $value);
)+
m
}
};
);
#[macro_export]
macro_rules! set {
($($x:expr_2021),+ $(,)?) => (
{
extern crate alloc;
let mut s = alloc::collections::BTreeSet::new();
$(
s.insert($x);
)*
s
}
);
}
#[macro_export]
#[cfg(feature = "std")]
macro_rules! hmap(
{ $($key:expr_2021 => $value:expr_2021),+ } => {
{
let mut m = std::collections::HashMap::new();
$(
m.insert($key, $value);
)+
m
}
};
);
#[macro_export]
#[cfg(feature = "std")]
macro_rules! hset {
($($x:expr_2021),+ $(,)?) => (
{
let mut s = std::collections::HashSet::new();
$(
s.insert($x);
)*
s
}
);
}