|
| 1 | +use crate::keyword::Keyword; |
| 2 | +use crate::maps::MapEntry; |
| 3 | +use crate::persistent_list::PersistentListIter; |
| 4 | +use crate::persistent_list::ToPersistentListIter; |
| 5 | +use crate::persistent_list_map::ToPersistentListMapIter; |
| 6 | +use crate::persistent_list_map::{PersistentListMap, PersistentListMapIter}; |
| 7 | +use crate::persistent_vector::PersistentVectorIter; |
| 8 | +use crate::persistent_vector::ToPersistentVector; |
| 9 | +use crate::persistent_vector::ToPersistentVectorIter; |
| 10 | +use crate::protocol::Protocol; |
| 11 | +use crate::define_protocol; |
| 12 | +use crate::symbol::Symbol; |
| 13 | +use crate::value::ToValue; |
| 14 | +use crate::value::Value; |
| 15 | +use std::rc::Rc; |
| 16 | + |
| 17 | +define_protocol!( |
| 18 | + IMeta = PersistentList | |
| 19 | + PersistentVector | |
| 20 | + PersistentList | |
| 21 | + PersistentListMap | |
| 22 | + Symbol | |
| 23 | + IFn |
| 24 | +); |
| 25 | + |
| 26 | +/// Syntactic sugar, DRY |
| 27 | +/// map_entry!("doc", "this is a docstring"); |
| 28 | +#[macro_export] |
| 29 | +macro_rules! map_entry { |
| 30 | + ($key:expr, $value:expr) => {{ |
| 31 | + MapEntry { |
| 32 | + key: Keyword::intern($key).to_rc_value(), |
| 33 | + val: $value.to_rc_value(), |
| 34 | + } |
| 35 | + }}; |
| 36 | +} |
| 37 | + |
| 38 | +/// Syntactic sugar, DRY |
| 39 | +/// persistent_list_map!(map_entry!("key1", "value1"), map_entry!("key2", "value2")); |
| 40 | +#[macro_export] |
| 41 | +macro_rules! persistent_list_map {} |
| 42 | + ( $($kv:expr), *) => { |
| 43 | + { |
| 44 | + let mut temp_vec = Vec::new(); |
| 45 | + $( |
| 46 | + temp_vec.push($kv); |
| 47 | + )* |
| 48 | + temp_vec.into_iter().collect::<PersistentListMap>() |
| 49 | + } |
| 50 | + }; |
| 51 | +} |
| 52 | + |
| 53 | +/// Syntactic sugar, DRY |
| 54 | +/// merge!(base_meta(name, ns), map_entry!("key1", "value1"), map_entry!("key2", "value2")); |
| 55 | +#[macro_export] |
| 56 | +macro_rules! merge { |
| 57 | + ( $plistmap:expr, $($kv:expr), *) => { |
| 58 | + { |
| 59 | + let mut temp_plistmap_as_vec = $plistmap.clone().iter().collect::<Vec<MapEntry>>(); |
| 60 | + $( |
| 61 | + temp_plistmap_as_vec.push($kv); |
| 62 | + )* |
| 63 | + temp_plistmap_as_vec.into_iter().collect::<PersistentListMap>() |
| 64 | + } |
| 65 | + }; |
| 66 | +} |
| 67 | + |
| 68 | +/// Constructs base meta if none provided |
| 69 | +/// {:line 1 |
| 70 | +/// :column 1 |
| 71 | +/// :file "NO_SOURCE_PATH" |
| 72 | +/// :name <something> |
| 73 | +/// :ns <namespace>} |
| 74 | +/// |
| 75 | +pub fn base_meta(ns: &str, name: &str) -> PersistentListMap { |
| 76 | + persistent_list_map!( |
| 77 | + map_entry!("line", 1_i32), |
| 78 | + map_entry!("column", 1_i32), |
| 79 | + map_entry!("file", "NO_SOURCE_PATH"), |
| 80 | + map_entry!("ns", Symbol::intern(ns)), |
| 81 | + map_entry!("name", Symbol::intern(name)) |
| 82 | + ) |
| 83 | +} |
0 commit comments