kvlog 0.1.6

Fast Structual and Hierarchical binary logging for rust
Documentation
use std::cell::Cell;

use kvlog::collector::{set_uninitialized_log_policy, UninitializedLogPolicy};
use kvlog::EnvGuard;

static ENABLED: EnvGuard = EnvGuard::new("KVLOG_TEST_MACRO_ENABLED");
static DISABLED: EnvGuard = EnvGuard::new("KVLOG_TEST_MACRO_DISABLED");

struct CountingGuard<'a> {
    calls: &'a Cell<usize>,
}

impl CountingGuard<'_> {
    fn is_enabled(&self) -> bool {
        self.calls.set(self.calls.get() + 1);
        true
    }
}

fn record_count() -> usize {
    let logger = kvlog::global_logger();
    kvlog::encoding::decode(logger.encoder.bytes())
        .map(Result::unwrap)
        .count()
}

#[test]
fn guarded_logging_skips_disabled_bodies_and_supports_all_levels() {
    set_uninitialized_log_policy(UninitializedLogPolicy::Buffer {
        max_bytes: usize::MAX,
    });
    kvlog::global_logger().encoder.clear();

    ENABLED.set(true);
    DISABLED.set(false);

    let fields_evaluated = Cell::new(0);
    kvlog::info!(DISABLED; "disabled", value = {
        fields_evaluated.set(fields_evaluated.get() + 1);
        1u8
    });
    assert_eq!(fields_evaluated.get(), 0);
    assert_eq!(record_count(), 0);

    kvlog::info!(ENABLED; "info", value = {
        fields_evaluated.set(fields_evaluated.get() + 1);
        1u8
    });
    kvlog::warn!(ENABLED; "warn", value = {
        fields_evaluated.set(fields_evaluated.get() + 1);
        2u8
    });
    kvlog::error!(ENABLED; "error", value = {
        fields_evaluated.set(fields_evaluated.get() + 1);
        3u8
    });
    kvlog::debug!(ENABLED; "debug", value = {
        fields_evaluated.set(fields_evaluated.get() + 1);
        4u8
    });

    let condition_calls = Cell::new(0);
    let counting_guard = CountingGuard {
        calls: &condition_calls,
    };
    kvlog::info!(&counting_guard; "expression guard");

    assert_eq!(condition_calls.get(), 1);
    if cfg!(feature = "debug") {
        assert_eq!(fields_evaluated.get(), 4);
        assert_eq!(record_count(), 5);
    } else {
        assert_eq!(fields_evaluated.get(), 3);
        assert_eq!(record_count(), 4);
    }
}