Skip to content

Commit f99839a

Browse files
committed
Created IMeta protocol
1 parent 48f7603 commit f99839a

File tree

1 file changed

+83
-0
lines changed

1 file changed

+83
-0
lines changed

src/protocols/imeta.rs

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
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

Comments
 (0)