gedaechtnas/gdn/src/data.rs

52 lines
1.4 KiB
Rust

use std::path::PathBuf;
use anyhow::Context;
use directories::ProjectDirs;
mod datadir;
mod lockfile;
mod v0;
mod v1;
pub use crate::repo::VERSION as REPO_VERSION;
pub use self::{
datadir::{LockedDataDir, UnlockedDataDir},
v1::{State, VERSION, add_repo, load_repo, load_repo_version, load_state, remove_repo, tidy},
};
fn migrate(dir: &LockedDataDir) -> anyhow::Result<()> {
loop {
let version = dir.read_version().context("failed to migrate data dir")?;
match version {
v0::VERSION => v0::migrate(dir),
_ => break Ok(()),
}
.with_context(|| format!("failed to migrate data dir from version {version}"))?;
}
}
pub fn read_version(path: PathBuf) -> anyhow::Result<u32> {
let dir = UnlockedDataDir::new(path);
let version = dir.read_version()?;
Ok(version)
}
pub fn open(path: PathBuf) -> anyhow::Result<UnlockedDataDir> {
let dir = UnlockedDataDir::new(path);
dir.require_version(VERSION)?;
Ok(dir)
}
pub fn open_and_migrate(path: PathBuf) -> anyhow::Result<LockedDataDir> {
let dir = UnlockedDataDir::new(path).lock()?;
migrate(&dir)?;
dir.require_version(VERSION)?;
Ok(dir)
}
pub fn path() -> anyhow::Result<PathBuf> {
let dirs = ProjectDirs::from("de", "plugh", crate::TECHNICAL_NAME)
.context("failed to locate data dir")?;
Ok(dirs.data_dir().to_path_buf())
}