diff --git a/Cargo.toml b/Cargo.toml index 41eb4be..8627c59 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,15 +15,18 @@ edition = "2021" [dependencies] fs2 = "0.4" log = "0.4" -parking_lot = "0.12.1" -serde = "1" -serde_json = "1" -uuid = { version = "1", features = ["v4"] } +parking_lot = "0.12" +serde = "1.0" +serde_json = "1.0" +uuid = { version = "1.11", features = ["v4"] } [dev-dependencies] -serde = { version = "1", features = ["derive"] } -serde_derive = { version = "1" } -tempfile = "3.4.0" +serde = { version = "1.0", features = ["derive"] } +serde_derive = { version = "1.0" } +tempfile = "3.15" -[badges] -maintenance = { status = "actively-developed" } +[lints.clippy] +pedantic = { level = "warn", priority = -1 } + +# The error types returned should be self-explanatory. +missing_errors_doc = "allow" diff --git a/README.md b/README.md index 7381b95..15ef580 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ See [docs.rs/jfs](https://docs.rs/jfs/). ## License -Copyright (c) 2016 - 2023 Markus Kohlhase +Copyright (c) 2016 - 2025 Markus Kohlhase This library is licensed under either of diff --git a/src/file_store.rs b/src/file_store.rs index cd00105..c2402db 100644 --- a/src/file_store.rs +++ b/src/file_store.rs @@ -1,22 +1,23 @@ -use crate::json_store::JsonStore; -use fs2::FileExt; -use serde::{Deserialize, Serialize}; -use serde_json::{ - ser::{PrettyFormatter, Serializer}, - value::Map, - Value, -}; use std::{ collections::BTreeMap, fs::{create_dir_all, metadata, read_dir, remove_file, rename, OpenOptions}, io::{ - prelude::*, - {Error, ErrorKind, Result}, + Read, Write, {Error, ErrorKind, Result}, }, path::{Path, PathBuf}, }; + +use fs2::FileExt; +use serde::{Deserialize, Serialize}; +use serde_json::{ + ser::{PrettyFormatter, Serializer}, + value::Map, + Value, +}; use uuid::Uuid; +use crate::json_store::JsonStore; + type Object = Map; #[derive(Debug, Clone, Copy)] @@ -47,7 +48,8 @@ impl JsonStore for FileStore { where for<'de> T: Serialize + Deserialize<'de>, { - self.save_with_id(obj, &Uuid::new_v4().to_string()) + let id = Uuid::new_v4().to_string(); + self.save_with_id(obj, &id) } fn save_with_id(&self, obj: &T, id: &str) -> Result @@ -56,10 +58,11 @@ impl JsonStore for FileStore { { if self.cfg.single { let json = get_json_from_file(&self.path)?; - let o = get_object_from_json(&json)?; - let mut x = o.clone(); - let j = serde_json::to_value(obj).map_err(|err| Error::new(ErrorKind::Other, err))?; - x.insert(id.to_owned(), j); + let object = get_object_from_json(&json)?; + let mut x = object.clone(); + let json = + serde_json::to_value(obj).map_err(|err| Error::new(ErrorKind::Other, err))?; + x.insert(id.to_owned(), json); self.save_object_to_file(&x, &self.path)?; } else { self.save_object_to_file(obj, &self.id_to_path(id))?; @@ -72,7 +75,7 @@ impl JsonStore for FileStore { for<'de> T: Deserialize<'de>, { let json = get_json_from_file(&self.id_to_path(id))?; - let o = if self.cfg.single { + let object = if self.cfg.single { let x = json .get(id) .ok_or_else(|| Error::new(ErrorKind::NotFound, "no such object"))?; @@ -80,7 +83,7 @@ impl JsonStore for FileStore { } else { json }; - decode(o) + decode(object) } fn all(&self) -> Result> @@ -89,12 +92,12 @@ impl JsonStore for FileStore { { if self.cfg.single { let json = get_json_from_file(&self.id_to_path(""))?; - let o = get_object_from_json(&json)?; + let object = get_object_from_json(&json)?; let mut result = BTreeMap::new(); - for x in o.iter() { - let (k, v) = x; - if let Ok(r) = decode(v.clone()) { - result.insert(k.clone(), r); + for x in object { + let (key, value) = x; + if let Ok(r) = decode(value.clone()) { + result.insert(key.clone(), r); } } return Ok(result); @@ -129,8 +132,8 @@ impl JsonStore for FileStore { fn delete(&self, id: &str) -> Result<()> { if self.cfg.single { let json = get_json_from_file(&self.path)?; - let o = get_object_from_json(&json)?; - let mut x = o.clone(); + let object = get_object_from_json(&json)?; + let mut x = object.clone(); if x.contains_key(id) { x.remove(id); } else { @@ -180,7 +183,7 @@ impl FileStore { fn save_object_to_file(&self, obj: &T, file_name: &Path) -> Result<()> { let json_string = self.object_to_string(obj)?; let mut tmp_filename = file_name.to_path_buf(); - tmp_filename.set_file_name(&Uuid::new_v4().to_string()); + tmp_filename.set_file_name(Uuid::new_v4().to_string()); tmp_filename.set_extension("tmp"); let file = OpenOptions::new() .write(true) @@ -198,8 +201,8 @@ impl FileStore { if let Err(err) = Write::write_all(&mut tmp_file, json_string.as_bytes()) { Err(err) } else { - tmp_file.unlock()?; - file.unlock()?; + FileExt::unlock(&tmp_file)?; + FileExt::unlock(&file)?; drop(file); drop(tmp_file); rename(tmp_filename, file_name) @@ -256,9 +259,9 @@ fn get_string_from_file(file_name: &Path) -> Result { .create(false) .open(file_name)?; let mut buffer = String::new(); - f.lock_shared()?; + FileExt::lock_shared(&f)?; f.read_to_string(&mut buffer)?; - f.unlock()?; + FileExt::unlock(&f)?; Ok(buffer) } @@ -452,7 +455,6 @@ mod tests { let dir = tempdir().unwrap().path().to_path_buf(); let db = FileStore::new(&dir).unwrap(); - #[cfg(feature = "serde_json")] #[derive(Deserialize, Serialize)] struct X { x: u32, diff --git a/src/json_store.rs b/src/json_store.rs index 389ed2a..457d114 100644 --- a/src/json_store.rs +++ b/src/json_store.rs @@ -1,6 +1,7 @@ -use serde::{Deserialize, Serialize}; use std::{collections::BTreeMap, io::Result}; +use serde::{Deserialize, Serialize}; + pub trait JsonStore: Send + Sync { fn save(&self, obj: &T) -> Result where diff --git a/src/lib.rs b/src/lib.rs index 46b8e38..ee039e1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -46,8 +46,7 @@ //! ```rust,no_run //! let db = jfs::Store::new(jfs::IN_MEMORY).unwrap(); //! ``` -use parking_lot::RwLock; -use serde::{Deserialize, Serialize}; + use std::{ collections::BTreeMap, io::Result, @@ -55,15 +54,16 @@ use std::{ sync::Arc, }; +use parking_lot::RwLock; +use serde::{Deserialize, Serialize}; + mod file_store; mod json_store; mod memory_store; -use file_store::FileStore; -use json_store::JsonStore; -use memory_store::MemoryStore; +use self::{file_store::FileStore, json_store::JsonStore, memory_store::MemoryStore}; -pub use file_store::Config; +pub use self::file_store::Config; #[derive(Debug, Clone)] pub struct Store(StoreType); diff --git a/src/memory_store.rs b/src/memory_store.rs index 11f0a70..78fcecf 100644 --- a/src/memory_store.rs +++ b/src/memory_store.rs @@ -1,12 +1,14 @@ -use crate::json_store::JsonStore; -use parking_lot::{Mutex, RwLock}; -use serde::{Deserialize, Serialize}; use std::{ collections::{BTreeMap, HashMap}, io::{Error, ErrorKind, Result}, sync::Arc, }; + use uuid::Uuid; +use parking_lot::{Mutex, RwLock}; +use serde::{Deserialize, Serialize}; + +use crate::json_store::JsonStore; #[derive(Debug, Clone, Default)] pub struct MemoryStore { @@ -187,7 +189,6 @@ mod tests { fn all() { let db = MemoryStore::default(); - #[cfg(feature = "serde_json")] #[derive(Deserialize, Serialize)] struct X { x: u32,