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
68
69
70
71
72
73
74
pub fn is_defined<'el, S>(toks: S) -> ::genco::Tokens<'el, ::genco::JavaScript<'el>>
where
    S: Into<::genco::Tokens<'el, ::genco::JavaScript<'el>>>,
{
    let s = toks.into();
    toks![s.clone(), " !== null && ", s, " !== undefined"]
}

pub fn is_not_defined<'el, S>(toks: S) -> ::genco::Tokens<'el, ::genco::JavaScript<'el>>
where
    S: Into<::genco::Tokens<'el, ::genco::JavaScript<'el>>>,
{
    let s = toks.into();
    toks![s.clone(), " === null || ", s, " === undefined"]
}

#[macro_export]
macro_rules! js {
    ([ $arguments:expr ]) => {{
        toks!["[", $arguments.join(", "), "]"]
    }};

    (= $key:expr, $value:expr) => {{
        toks![$key, " = ", $value, ";"]
    }};

    (throw $($args:expr),*) => {{
        toks!["throw new Error(", $($args,)* ");"]
    }};

    (@return $($tail:tt)*) => {{
        toks!["return ", js![$( $tail )*], ";"]
    }};

    (return $($args:expr),*) => {{
        toks!["return ", $($args,)* ";"]
    }};

    (new $type:expr, $arguments:expr) => {{
        toks!["new ", $type, "(", $arguments.join(", "), ")"]
    }};

    (if $cond:expr, $true:expr) => {{
        let mut el = Tokens::new();

        el.push(toks!["if (", $cond, ") {"]);
        el.nested($true);
        el.push("}");

        el
    }};

    (if $cond:expr, $true:expr, $false:expr) => {{
        let mut el = Tokens::new();

        el.push(toks!["if (", $cond, ") {"]);
        el.nested($true);
        el.push("} else {");
        el.nested($false);
        el.push("}");

        el
    }};

    (for $init:expr; $while:expr; $next:expr, $($body:expr),*) => {{
        let mut el = Tokens::new();

        el.push(toks!["for (", $init, "; ", $while, "; ", $next, ") {"]);
        $(el.nested($body.join_line_spacing());)*
        el.push("}");

        el
    }}
}