1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
//! Tokay value and object representation
pub mod dict;
pub mod iter;
pub mod list;
mod method;
mod object;
mod parselet;
mod refvalue;
pub mod str;
pub mod token;
pub mod value;

pub use self::str::Str;
pub use dict::Dict;
pub use iter::*;
pub use list::List;
pub use method::Method;
pub use object::{BoxedObject, Object};
pub(crate) use parselet::{Parselet, ParseletRef};
pub use refvalue::RefValue;
pub use token::Token;
pub use value::Value;

/** Value construction macro

value!() is used to easily construct Tokay values and objects from Rust natives.

Examples:
```
use tokay::value;

let i = value!(1);  // int
let s = value!("String");  // str
let l = value!([1, 2, 3]);  // list of int
let d = value!(["a" => 1, "b" => 2, "c" => 3]);  // dict
```
*/
#[macro_export]
macro_rules! value {
    ( [ $( $key:literal => $value:tt ),* ] ) => {
        {
            let mut dict = $crate::value::Dict::new();
            $( dict.insert_str($key, $crate::value!($value)); )*
            $crate::RefValue::from(dict)
        }
    };

    ( [ $( $value:tt ),* ] ) => {
        {
            let mut list = $crate::value::List::new();
            $( list.push($crate::value!($value)); )*
            $crate::RefValue::from(list)
        }
    };

    ( void ) => {
        $crate::RefValue::from($crate::value::Value::Void)
    };

    ( null ) => {
        $crate::RefValue::from($crate::value::Value::Null)
    };

    ( $value:expr ) => {
        $crate::RefValue::from($value)
    }
}