Skip to main content

runtime_persistence/
runtime_persistence.rs

1use std::fs;
2use std::time::{SystemTime, UNIX_EPOCH};
3
4use this_me::kernel::Value;
5use this_me::runtime::{runtime_receipt_to_json, KernelRuntime};
6use this_me::storage::JsonFileStore;
7
8fn temp_state_path(label: &str) -> std::path::PathBuf {
9    let nonce = SystemTime::now()
10        .duration_since(UNIX_EPOCH)
11        .unwrap()
12        .as_nanos();
13    std::env::temp_dir().join(format!(
14        "this-me-example-{label}-{}-{nonce}.json",
15        std::process::id()
16    ))
17}
18
19fn run() -> Result<(), Box<dyn std::error::Error>> {
20    let path = temp_state_path("runtime");
21    let mut runtime = KernelRuntime::load(JsonFileStore::new(&path))?;
22
23    let receipt = runtime.write_with_receipt("apps.demo.home.count", 3_u64)?;
24    let json = runtime_receipt_to_json(&receipt);
25
26    assert_eq!(json["events"][0]["path"][0], "apps");
27    assert_eq!(json["events"][0]["path"][2], "home");
28    assert_eq!(json["events"][0]["value"], 3.0);
29
30    let restored = KernelRuntime::load(JsonFileStore::new(&path))?;
31    assert_eq!(
32        restored.read("apps.demo.home.count"),
33        Some(&Value::from(3_u64))
34    );
35    assert!(restored.events().is_empty());
36
37    println!("{json}");
38    let _ = fs::remove_file(path);
39    Ok(())
40}
41
42fn main() -> Result<(), Box<dyn std::error::Error>> {
43    run()
44}
45
46#[test]
47fn example_runs() {
48    run().unwrap();
49}