use std::fs;
use std::path::Path;
use okerr::Result;
use serde::{Deserialize, Serialize};
use crate::{MetaStatus, Metadata, init_meta_datetimes_if_empty, meta_loaded};
#[cfg(feature = "json")]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct JsonMetadata {
pub version: i32,
pub app_version: String,
pub status: MetaStatus,
pub created_at: String,
pub updated_at: String,
}
#[cfg(feature = "json")]
impl Default for JsonMetadata {
fn default() -> Self {
Self {
version: 0,
app_version: String::new(),
status: MetaStatus::Clean,
created_at: String::new(),
updated_at: String::new(),
}
}
}
#[cfg(feature = "json")]
impl JsonMetadata {
pub fn load_or_init(path: impl AsRef<Path>) -> Result<Self> {
let path = path.as_ref();
if path.exists() {
let txt = fs::read_to_string(path)?;
let meta: Self = serde_json::from_str(&txt)?;
meta_loaded(meta)
} else {
Self::init_new(path)
}
}
pub fn save(&self, path: impl AsRef<Path>) -> Result<()> {
let txt = serde_json::to_string_pretty(self)?;
fs::write(path, txt)?;
Ok(())
}
fn init_new(path: impl AsRef<Path>) -> Result<Self> {
let mut meta = Self::default();
meta.set_version(0);
meta.set_status(MetaStatus::Clean);
meta.set_app_version(env!("CARGO_PKG_VERSION").to_string());
init_meta_datetimes_if_empty(&mut meta);
meta.save(path)?;
Ok(meta)
}
}
#[cfg(feature = "json")]
impl Metadata for JsonMetadata {
crate::metadata_accessors!();
}