blkar 7.2.7

Multithreaded archiver offering bit rot protection and sector level recoverability
Documentation
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")
    }};
}