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}