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
use std::collections::HashMap;

#[allow(dead_code)]
pub struct Extension {
    name: String,
    params: Vec<Parameter>
}

impl Extension {
    pub fn new(name: String, params: Vec<Parameter>) -> Self {
        Extension { name, params }
    } 
}

#[allow(dead_code)]
pub struct Parameter {
    name: String,
    args: Option<HashMap<String, Option<String>>> 
}

impl Parameter {
    pub fn new(name: String, args: Option<HashMap<String, Option<String>>>) -> Self {
        Parameter { name, args }
    }
}

#[macro_export]
macro_rules! parameter {
    ($n:expr) => { Parameter::new($n.to_string(), None) };
    ($n:expr; $($arg:expr),*) => {
        {
            let mut args: HashMap<String, Option<String>> = HashMap::new();
            
            $(
                let arg_val = String::from($arg);
                let index = arg_val.find('=');

                match index { 
                    Some(i) => {
                        let arg = (&arg_val[0..i]).trim().to_string(); 
                        let val = (&arg_val[i+1..arg_val.len()]).trim().to_string();
                        args.insert(arg, Some(val));
                    },
                    None => { args.insert(arg_val, None); }
                }
            )* 
            Parameter::new($n.to_string(), Some(args))
        }
    };
}