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
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
macro_rules! skip_quotes_for_term {
    (
        $val:expr
    ) => {{
        $val == "null" || $val == "true" || $val == "false"
    }};
}

macro_rules! determine_if_skip_quotes {
    (
        $force_quotes:expr, $val:expr
    ) => {{
        !$force_quotes && (skip_quotes_for_term!($val) || $val.parse::<u64>().is_ok())
    }};
}

macro_rules! write_json_field {
    (
        $f:expr, $key:expr, $val:expr, $force_quotes:expr, $no_comma:expr
    ) => {{
        use crate::misc_utils::escape_quotes;

        if !$no_comma {
            write!($f, ",")?;
        }

        if determine_if_skip_quotes!($force_quotes, $val) {
            writeln!($f, "\"{}\": {}", to_camelcase($key), escape_quotes(&$val))
        } else {
            writeln!(
                $f,
                "\"{}\": \"{}\"",
                to_camelcase($key),
                escape_quotes(&$val)
            )
        }
    }};
}

macro_rules! print_json_field {
    (
        $output_channel:expr => $key:expr, $val:expr, $force_quotes:expr, $no_comma:expr
    ) => {{
        use crate::misc_utils::{escape_quotes,
                                to_camelcase};

        if !$no_comma {
            print_at_output_channel!($output_channel => ",");
        }

        if determine_if_skip_quotes!($force_quotes, $val) {
            println_at_output_channel!($output_channel => "\"{}\": {}", to_camelcase($key), escape_quotes(&$val));
        } else {
            println_at_output_channel!($output_channel => "\"{}\": \"{}\"", to_camelcase($key), escape_quotes(&$val));
        }
    }};
}

#[macro_export]
macro_rules! print_field_if_json {
    (
        $json_printer:expr, $($t:tt)*
    ) => {{
        if $json_printer.json_enabled() {
            print_maybe_json!($json_printer, $($t)*);
        }
    }}
}

#[macro_export]
macro_rules! print_maybe_json {
    (
        $json_printer:expr, $($val:expr),* => force_quotes
    ) => {{
        print_maybe_json!($json_printer, $($val),* => true)
    }};
    (
        $json_printer:expr, $($val:expr),*
    ) => {{
        print_maybe_json!($json_printer, $($val),* => false)
    }};
    (
        $json_printer:expr, $($val:expr),* => $force_quotes:expr
    ) => {{
        let msg = format!($($val),*);

        $json_printer.print_maybe_json($force_quotes, &msg);
    }}
}

macro_rules! write_maybe_json {
    (
        $f:expr, $json_printer:expr, $($val:expr),* => force_quotes
    ) => {{
        write_maybe_json!($f, $json_printer, $($val),* => true)
    }};
    (
        $f:expr, $json_printer:expr, $($val:expr),*
    ) => {{
        write_maybe_json!($f, $json_printer, $($val),* => false)
    }};
    (
        $f:expr, $json_printer:expr, $($val:expr),* => $force_quotes:expr
    ) => {{
        let msg = format!($($val),*);

        $json_printer.write_maybe_json($f, $force_quotes, &msg)
    }}
}

macro_rules! null_if_json_else {
    (
        $json_printer:expr, $val:expr
    ) => {{
        if $json_printer.json_enabled() {
            "null"
        } else {
            $val
        }
    }};
}

macro_rules! null_if_json_else_NA {
    (
        $json_printer:expr
    ) => {{
        null_if_json_else!($json_printer, "N/A")
    }};
}