Skip to main content

one_member/
one_member.rs

1//! One-member verified transaction.
2//!
3//! Demonstrates the supported path:
4//! `InstallPlan -> prepare -> verify_integrity -> validate -> commit(ownership)`.
5//!
6//! Run with `cargo run -p eggup-core --example one_member`.
7
8use eggup_core::{
9    AbsentPolicy, AllValidators, ArtifactMember, ArtifactSet, CommitOwnership,
10    ExistingAsOwnedVerifier, InstallPlan, IntegrityRequirement, MemberId, ProductId, ReleaseId,
11    TransactionDisposition,
12};
13use std::fs;
14use std::path::PathBuf;
15use std::time::{SystemTime, UNIX_EPOCH};
16
17fn temp_root(prefix: &str) -> PathBuf {
18    let nanos = SystemTime::now()
19        .duration_since(UNIX_EPOCH)
20        .map(|d| d.as_nanos())
21        .unwrap_or(0);
22    std::env::temp_dir().join(format!("{prefix}-{}-{nanos}", std::process::id()))
23}
24
25fn main() -> Result<(), Box<dyn std::error::Error>> {
26    let base = temp_root("eggup-one-member");
27    let inputs = base.join("inputs");
28    let root = base.join("install");
29    fs::create_dir_all(inputs.join("bin"))?;
30    fs::create_dir_all(root.join("bin"))?;
31    fs::write(inputs.join("app"), b"new-app")?;
32    let digest = eggup_core::hash_file(&inputs.join("app"))?;
33    let member = ArtifactMember::new(MemberId::new("main")?, inputs.join("app"), "bin/app")?
34        .with_integrity(IntegrityRequirement::Sha256(digest));
35    let plan = InstallPlan::new(
36        ProductId::new("demo")?,
37        ReleaseId::new("1.0.0")?,
38        &root,
39        ArtifactSet::single(member)?,
40    )?;
41    let receipt = plan
42        .prepare()?
43        .verify_integrity()?
44        .validate(&AllValidators::new())?
45        .commit(CommitOwnership::new(
46            &ExistingAsOwnedVerifier,
47            AbsentPolicy::AllowCreate,
48        ))?;
49    assert_eq!(receipt.disposition(), TransactionDisposition::Committed);
50    assert_eq!(fs::read(root.join("bin/app"))?, b"new-app");
51    let _ = fs::remove_dir_all(&base);
52    println!("one-member commit: {:?}", receipt.disposition());
53    Ok(())
54}