diff --git a/Cargo.lock b/Cargo.lock index 35ac356..4bc9281 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -148,6 +148,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "dtoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0" + [[package]] name = "exitfailure" version = "0.5.1" @@ -228,6 +234,12 @@ version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9385f66bf6105b241aa65a61cb923ef20efc665cb9f9bb50ac2f0c4b7f378d41" +[[package]] +name = "linked-hash-map" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" + [[package]] name = "miniz_oxide" version = "0.4.4" @@ -343,17 +355,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "ron" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "064ea8613fb712a19faf920022ec8ddf134984f100090764a4e1d768f3827f1f" -dependencies = [ - "base64", - "bitflags", - "serde", -] - [[package]] name = "rust-argon2" version = "0.8.3" @@ -372,8 +373,8 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460d97902465327d69ecfe8cefdb5972c6f94d6127ac9e992acdb51458bebc27" dependencies = [ - "ron", "serde", + "serde_yaml", "tempfile", "thiserror", ] @@ -404,6 +405,18 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_yaml" +version = "0.8.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15654ed4ab61726bf918a39cb8d98a2e2995b002387807fa6ba58fdf7f59bb23" +dependencies = [ + "dtoa", + "linked-hash-map", + "serde", + "yaml-rust", +] + [[package]] name = "strsim" version = "0.8.0" @@ -535,7 +548,16 @@ dependencies = [ "clap", "directories", "exitfailure", - "ron", "rustbreak", "serde", + "serde_yaml", +] + +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", ] diff --git a/Cargo.toml b/Cargo.toml index 43d4a46..5fd721b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,9 +11,9 @@ version = "0.1.0" clap = "2.33.3" directories = "3.0.1" exitfailure = "0.5.1" -ron = "0.6.4" -serde = "1.0.125" +serde = {version = "1.0", features = ["derive"]} +serde_yaml = "" [dependencies.rustbreak] -features = ["ron_enc"] +features = ["yaml_enc"] version = "2" diff --git a/src/main.rs b/src/main.rs index f1ae2bd..71712c2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,38 +1,73 @@ use directories::ProjectDirs; use exitfailure::ExitFailure; -use rustbreak::{deser::Ron, PathDatabase}; +use rustbreak::{deser::Yaml, PathDatabase}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::io::{Error, ErrorKind}; +#[derive(Serialize, Deserialize, Clone, Debug)] +enum Version { + V1, +} + +#[derive(Serialize, Deserialize, Clone, Debug)] +struct Doc { + // If data type changes, up the version and write migration. + version: Version, + data: serde_yaml::Value, +} + +impl Default for Doc { + fn default() -> Self { + let data: V1Data = HashMap::new(); + Doc { + version: Version::V1, + data: serde_yaml::to_value(data).expect("yaml opps"), + } + } +} + +type V1Data = HashMap; + #[derive(Serialize, Deserialize, Clone, Debug)] struct Entity { id: String, } +fn edit_data(db: &mut Doc, f: F) +where + F: Fn(&mut V1Data) -> (), +{ + let val: &mut V1Data = &mut serde_yaml::from_value(db.data.clone()).expect("err"); + f(val); + db.data = serde_yaml::to_value(val).expect("err"); +} + fn main() -> Result<(), ExitFailure> { let proj_dirs = ProjectDirs::from("ca", "srid", "X").ok_or(Error::new(ErrorKind::Other, "No Home"))?; - let ron_file = proj_dirs.data_dir().with_extension("ron"); + let db_file = proj_dirs.data_dir().with_extension("yaml"); - let db = PathDatabase::, Ron>::load_from_path(ron_file)?; + let db = PathDatabase::::load_from_path_or_default(db_file)?; db.read(|db| { - println!("Init: {:?}", db.get(&0)); + println!("Init: {:?}", db.data); })?; db.write(|db| { - db.insert( - 0, - Entity { - id: "test".to_string(), - }, - ); + edit_data(db, |val: &mut V1Data| { + val.insert( + 0, + Entity { + id: "test".to_string(), + }, + ); + }); })?; db.save()?; db.read(|db| { - println!("Just wrote: {:?}", db.get(&0)); + println!("Writ: {:?}", db.data); })?; Ok(())