oxide_core 0.4.0

Rust engine primitives for Oxide (store, snapshot streams, error model, optional persistence).
Documentation
#![cfg(feature = "state-persistence")]

use oxide_core::persistence;

#[derive(Debug, PartialEq, serde::Serialize, serde::Deserialize)]
struct Model {
    counter: u64,
    label: String,
}

#[test]
fn persistence_round_trip_model() {
    let value = Model {
        counter: 42,
        label: "hello".to_string(),
    };

    let bytes = persistence::encode(&value).expect("encode");
    let decoded: Model = persistence::decode(&bytes).expect("decode");
    assert_eq!(decoded, value);
}

#[test]
fn persistence_decode_rejects_invalid_payload() {
    let bytes = vec![0_u8, 1, 2, 3];
    let decoded: Result<Model, _> = persistence::decode(&bytes);
    assert!(decoded.is_err());
}

#[cfg(feature = "persistence-json")]
#[test]
fn json_codec_is_used_for_encode_decode() {
    let value = Model {
        counter: 7,
        label: "world".to_string(),
    };

    let bytes = persistence::encode(&value).expect("encode");
    assert!(
        bytes.starts_with(b"{"),
        "expected JSON bytes when persistence-json feature is enabled"
    );

    let decoded: Model = persistence::decode(&bytes).expect("decode");
    assert_eq!(decoded, value);
}

#[cfg(feature = "persistence-json")]
#[test]
fn json_string_codec_round_trip() {
    let value = Model {
        counter: 99,
        label: "oxide".to_string(),
    };

    let json = persistence::encode_json(&value).expect("encode");
    let decoded: Model = persistence::decode_json(&json).expect("decode");
    assert_eq!(decoded, value);
}

#[cfg(feature = "persistence-json")]
#[test]
fn json_string_codec_rejects_invalid_payload() {
    let decoded: Result<Model, _> = persistence::decode_json("not-json");
    assert!(decoded.is_err());
}