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
#![macro_use]

#[macro_export]
macro_rules! md {
    ($e : expr) => {
        SlackBlockMarkDownText::new($e.into()).into()
    };

    ($e : expr, $($es:expr),+) => {
        md!(format!($e,$($es),+))
    };
}

#[macro_export]
macro_rules! pt {
    ($e : expr) => {
        SlackBlockPlainText::new($e.into()).into()
    };

    ($e : expr, $($es:expr),+) => {
        pt!(format!($e,$($es),+))
    };
}

#[macro_export]
macro_rules! slack_block_item {
    (optionally ($pred:expr => $item:expr)) => {{
        if $pred {
            slack_block_item! (some $item)
        }
        else {
            None
        }
    }};

    (some $item:expr) => {{
        Some($item)
    }};

    (optionally_into ($pred:expr => $item:expr)) => {{
        if $pred {
            slack_block_item! (some_into $item)
        }
        else {
            None
        }
    }};

    (some_into $item:expr ) => {{
        Some($item.into())
    }};
}

#[macro_export]
macro_rules! slack_blocks {

    () => { vec![] };

    ($($pred : tt($item:expr $(=> $item_r:expr)?)),+) => {{
        vec![
            $(slack_block_item! ($pred($item $(=> $item_r)?))),*
        ].into_iter().flatten().collect()
    }};
}