Rust quickstart
This is a ~60-second round-trip: snapshot a directory, push it to a local
file:// store, pull it back into a fresh directory, and confirm the
snapshot ID matches. Snapshot IDs are 64-character lowercase hex and are
bit-identical to the CLI and every other binding.
1. Install
cargo add snapdir-api
cargo add tokio --features full
snapdir-api is a native crate — cargo builds it from source, no C toolchain
required. See Install snapdir for Rust for platform details.
2. Snapshot + push
Compute the snapshot ID for a directory, then push it to a local store. Both
calls return the same 64-character lowercase hex ID. The store URI is always an
argument — file://$PWD/store is a no-setup local store.
use snapdir_api::{id, push, ManifestOptions, PushSource, StoreUri, TransferOptions};
use std::path::Path;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let store = StoreUri::parse(&format!(
"file://{}/store",
std::env::current_dir()?.display()
))?;
// Snapshot ID — pure and deterministic, no store touched.
let snapshot_id = id(Path::new("./my-dir"), &ManifestOptions::default())?;
println!("{}", snapshot_id.to_hex()); // 64-char lowercase hex
// Upload the snapshot to the store; returns the same ID.
let pushed = push(
PushSource::Path(Path::new("./my-dir")),
&store,
&TransferOptions::default(),
)
.await?;
assert_eq!(pushed, snapshot_id);
Ok(())
}
3. Pull it back
Materialize the snapshot into a fresh directory and re-derive its ID — it is the same value you started with.
use snapdir_api::{id, pull, CheckoutOptions, ManifestOptions};
use std::path::Path;
pull(
&snapshot_id,
&store,
Path::new("./restored"),
&CheckoutOptions::default(),
)
.await?;
let restored = id(Path::new("./restored"), &ManifestOptions::default())?;
assert_eq!(restored, snapshot_id);
That <snapshot-id> is the exact same value you would get from snapdir id or
snapdir push on the CLI — the binding wraps the identical Rust core.