edda-derive 0.6.2

View rebuilding and tiered history for Edda
Documentation
mod context;
mod evidence;
mod snapshot;
mod types;
mod writers;

pub use context::render_context;
pub use evidence::{build_auto_evidence, last_commit_contribution, AutoEvidenceResult};
pub use types::*;
pub use writers::{rebuild_all, rebuild_branch};

#[cfg(test)]
pub(crate) mod test_support {
    use edda_core::types::Event;
    use edda_ledger::{EddaPaths, Ledger};
    use std::sync::atomic::{AtomicU64, Ordering};

    static TEST_COUNTER: AtomicU64 = AtomicU64::new(0);

    pub struct TestLedger(Ledger);

    impl std::ops::Deref for TestLedger {
        type Target = Ledger;

        fn deref(&self) -> &Self::Target {
            &self.0
        }
    }

    impl TestLedger {
        pub fn append_event(&self, event: &Event) -> anyhow::Result<()> {
            let mut chained = event.clone();
            chained.parent_hash = self.0.last_event_hash()?;
            edda_core::event::finalize_event(&mut chained)?;
            self.0.append_event(&chained)
        }
    }

    pub fn setup_workspace() -> (std::path::PathBuf, TestLedger) {
        let n = TEST_COUNTER.fetch_add(1, Ordering::SeqCst);
        let tmp = std::env::temp_dir().join(format!("edda_derive_test_{}_{n}", std::process::id()));
        let _ = std::fs::remove_dir_all(&tmp);
        let paths = EddaPaths::discover(&tmp);
        edda_ledger::ledger::init_workspace(&paths).unwrap();
        edda_ledger::ledger::init_head(&paths, "main").unwrap();
        edda_ledger::ledger::init_branches_json(&paths, "main").unwrap();
        let ledger = TestLedger(Ledger::open(&tmp).unwrap());
        (tmp, ledger)
    }
}