nvim_meta/value.rs
1/// A macro that makes creating [`rmpv`] values easier
2///
3/// Create an nil value by just calling value with no arguments:
4/// ```
5/// value!()
6/// ```
7///
8/// Create any single Value by just calling `value!` with the expression that you want to convert.
9/// This uses `Value::from` the hood
10/// ```
11/// value!(true)
12/// value!(3)
13/// ```
14///
15/// Create an array of Values using syntax similar to `vec!`:
16/// ```
17/// value!([]) // empty array
18/// value!([3, 4, 2, 234, 213]);
19/// value!([true, false, true true]);
20/// value!([true; 10]); // repeat a value
21/// ```
22///
23/// Create a map of Values using syntax similar to ruby
24/// ```
25/// value!([=>]) // empty map
26/// value!(["Cat" => false, "Dog" => true, "Fish" => false]);
27/// value!(["Dog" => true; 9]); // repeat a key value pair
28/// ```
29/// *Note*: Value::Map is just a `Vec<(Value, Value)>`, not a `HashMap`
30///
31/// [`rmpv`]: https://docs.rs/rmpv/0.4.7/rmpv/
32#[macro_export]
33macro_rules! value {
34 () => {
35 nvim_rs::Value::Nil
36 };
37
38 ($x:expr) => {
39 nvim_rs::Value::from($x)
40 };
41
42 ([]) => {
43 {
44 use nvim_rs::Value;
45 let v: Vec<Value> = Vec::new();
46 v
47 }
48 };
49
50 ([$elem:expr; $n:expr]) => {
51 {
52 use nvim_rs::Value;
53
54 let n = $n;
55 let value = Value::from($elem);
56 let vec: Vec<Value> = std::vec::Vec::with_capacity(n);
57
58 for _ in 0..n { v.push(value.clone()) }
59
60 v
61 }
62 };
63
64 ([$($x:expr),+ $(,)?]) => {
65 {
66 use nvim_rs::Value;
67 let v: Vec<Value> = <[_]>::into_vec(std::box::Box::new([$(Value::from($x)),+]));
68 v
69 }
70 };
71
72 ([=>]) => {
73 {
74 use nvim_rs::Value;
75 let v: Vec<(Value, Value)> = Vec::new();
76 v
77 }
78 };
79
80 ([$k:expr => $v:expr; $n:expr]) => {
81 {
82 use nvim_rs::Value;
83
84 let n = $n;
85 let tuple = (Value::from($k), Value::from($v));
86 let vec: Vec<(Value, Value)> = std::vec::Vec::with_capacity(n);
87
88 for _ in 0..n { v.push(tuple.clone()) }
89
90 v
91 }
92 };
93
94 ([$($k:expr => $v:expr),+ $(,)?]) => {
95 {
96
97 use nvim_rs::Value;
98 let v: Vec<Value> = <[_]>::into_vec(std::box::Box::new([$((Value::from($k), Value::from($v))),+]));
99 v
100 }
101 }
102}