osp-cli 1.5.1

CLI and REPL for querying and managing OSP infrastructure data
Documentation
use std::path::PathBuf;

#[macro_export]
macro_rules! assert_snapshot_text {
    ($name:expr, $text:expr $(,)?) => {{
        let sanitized = $crate::snapshot_support::sanitize_snapshot_text(
            ::std::convert::Into::<String>::into($text),
            &[],
        );
        let settings = $crate::snapshot_support::contract_snapshot_settings();
        settings.bind(|| insta::assert_snapshot!($name, sanitized));
    }};
}

#[macro_export]
macro_rules! assert_snapshot_text_with {
    ($name:expr, $text:expr, $replacements:expr $(,)?) => {{
        let sanitized = $crate::snapshot_support::sanitize_snapshot_text(
            ::std::convert::Into::<String>::into($text),
            $replacements,
        );
        let settings = $crate::snapshot_support::contract_snapshot_settings();
        settings.bind(|| insta::assert_snapshot!($name, sanitized));
    }};
}

#[macro_export]
macro_rules! assert_contract_snapshot {
    ($name:expr, $value:expr $(,)?) => {{
        let settings = $crate::snapshot_support::contract_snapshot_settings();
        settings.bind(|| insta::assert_snapshot!($name, $value));
    }};
}

pub(crate) fn contract_snapshot_settings() -> insta::Settings {
    let mut settings = insta::Settings::clone_current();
    settings.set_snapshot_path(contract_snapshots_dir());
    settings
}

fn contract_snapshots_dir() -> PathBuf {
    PathBuf::from(env!("CARGO_MANIFEST_DIR"))
        .join("tests")
        .join("contracts")
        .join("snapshots")
}

pub(crate) fn sanitize_snapshot_text(mut text: String, replacements: &[(&str, &str)]) -> String {
    text = text.replace("\r\n", "\n");
    for (from, to) in replacements {
        text = text.replace(from, to);
    }
    text.lines()
        .map(sanitize_log_timestamp)
        .collect::<Vec<_>>()
        .join("\n")
}

fn sanitize_log_timestamp(line: &str) -> String {
    if let Some(idx) = line.find("Z ")
        && line.chars().next().is_some_and(|ch| ch.is_ascii_digit())
    {
        return format!("<TIMESTAMP>{}", &line[idx..]);
    }
    line.to_string()
}