inspect-rs 0.1.0

Universal introspection for Rust
Documentation
use inspect_rs::{Inspect, InspectCx, Kind, Sensitivity};

#[derive(Inspect)]
struct SimpleStruct {
    id: u32,
    name: String,
}

#[test]
fn test_simple_struct() {
    let value = SimpleStruct { id: 1, name: "test".to_string() };

    let mut cx = InspectCx::new();
    let inspected = value.inspect(&mut cx);

    assert_eq!(inspected.kind(), &Kind::Struct);
    assert_eq!(inspected.type_info().name(), "SimpleStruct");

    let children = inspected.children().unwrap();
    assert_eq!(children.len(), 2);
}

#[derive(Inspect)]
struct TupleStruct(u32, String);

#[test]
fn test_tuple_struct() {
    let value = TupleStruct(42, "hello".to_string());

    let mut cx = InspectCx::new();
    let inspected = value.inspect(&mut cx);

    assert_eq!(inspected.kind(), &Kind::TupleStruct);
    assert_eq!(inspected.children().unwrap().len(), 2);
}

#[derive(Inspect)]
struct WithSecret {
    public: String,

    #[inspect(secret)]
    secret: String,
}

#[test]
fn test_secret_field() {
    let value = WithSecret { public: "visible".to_string(), secret: "hidden".to_string() };

    let mut cx = InspectCx::new();
    let inspected = value.inspect(&mut cx);

    let inspect_core::Children::Direct(fields) = inspected.children().unwrap();
    assert_eq!(fields[0].0.sensitivity(), Sensitivity::Normal);
    assert_eq!(fields[1].0.sensitivity(), Sensitivity::Secret);
}

#[derive(Inspect)]
struct WithSensitive {
    #[inspect(sensitive)]
    email: String,
}

#[test]
fn test_sensitive_field() {
    let value = WithSensitive { email: "user@example.com".to_string() };

    let mut cx = InspectCx::new();
    let inspected = value.inspect(&mut cx);

    let inspect_core::Children::Direct(fields) = inspected.children().unwrap();
    assert_eq!(fields[0].0.sensitivity(), Sensitivity::Sensitive);
}

#[derive(Inspect)]
struct WithSkip {
    visible: u32,

    #[inspect(skip)]
    #[allow(dead_code)]
    hidden: u32,
}

#[test]
fn test_skip_field() {
    let value = WithSkip { visible: 1, hidden: 2 };

    let mut cx = InspectCx::new();
    let inspected = value.inspect(&mut cx);

    // Should only have 1 field (visible)
    assert_eq!(inspected.children().unwrap().len(), 1);
}