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
macro_rules! one_arg {
    ($name:ident) => {
        (stringify!($name).into(), $crate::sass::Value::Null)
    };
    ($name:ident = $value:expr) => {{
        use $crate::parser::value::value_expression;
        (
            stringify!($name).into(),
            value_expression($value).unwrap().1,
        )
    }};
}

macro_rules! func {
    (( $($arg:ident $( = $value:expr )* ),* ), $body:expr) => {{
        use std::sync::Arc;
        SassFunction::builtin(vec![ $( one_arg!($arg $( = $value)* ) ),* ],
                              false,
                              Arc::new($body))
    }};
}
macro_rules! func_va {
    (( $($arg:ident $( = $value:expr )* ),* ), $body:expr) => {{
        use std::sync::Arc;
        SassFunction::builtin(vec![ $( one_arg!($arg $( = $value)* ) ),* ],
                              true,
                              Arc::new($body))
    }};
}
macro_rules! def {
    ($f:expr, $name:ident( $($arg:ident$(=$val:expr)* ),* ), $body:expr) => {
        $f.insert(
            stringify!($name),
            func!(($($arg $( = $val )* ),*), $body),
        )
    }
}
macro_rules! def_va {
    ($f:expr, $name:ident( $($arg:ident$(=$value:expr)* ),*), $body:expr) => {
        $f.insert(stringify!($name),
                  func_va!(($($arg $( = $value )* ),*), $body))
    }
}

macro_rules! func2 {
    ($name:ident( $($arg:ident $( = $value:expr )* ),* )) => {
        func!(($($arg $( = $value )* ),*),
              |s: &dyn Scope| $name($(s.get(stringify!($arg))?),*))
    };
}

macro_rules! dep_warn {
    ($first: expr, $($arg:expr),*) => {{
        use std::sync::Once;
        static WARN: Once = Once::new();
        WARN.call_once(|| {
            eprintln!(concat!("DEPRECATION WARNING: ", $first), $($arg),*);
        });
    }};
    ($first: expr) => {{
        use std::sync::Once;
        static WARN: Once = Once::new();
        WARN.call_once(|| eprintln!(concat!("DEPRECATION WARNING: ", $first)));
    }}
}