From acdfe269bd3a8dd270a88e2cd4e2a0d729be4046 Mon Sep 17 00:00:00 2001 From: vandomej Date: Thu, 2 Sep 2021 17:55:39 -0700 Subject: [PATCH] Separating file_linked package --- .gitignore | 2 +- file_linked/Cargo.toml | 11 +++ .../mod.rs => file_linked/src/lib.rs | 84 +++++++------------ gemla/Cargo.toml | 3 +- gemla/src/bracket/mod.rs | 2 +- gemla/src/lib.rs | 2 +- 6 files changed, 44 insertions(+), 60 deletions(-) create mode 100644 file_linked/Cargo.toml rename gemla/src/file_linked/mod.rs => file_linked/src/lib.rs (75%) diff --git a/.gitignore b/.gitignore index 6f66af9..ff86a46 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ # Generated by Cargo # will have compiled files and executables -/gemla/target/ +target/ # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries # More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html diff --git a/file_linked/Cargo.toml b/file_linked/Cargo.toml new file mode 100644 index 0000000..d453f98 --- /dev/null +++ b/file_linked/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "file_linked" +version = "0.1.0" +authors = ["vandomej "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" \ No newline at end of file diff --git a/gemla/src/file_linked/mod.rs b/file_linked/src/lib.rs similarity index 75% rename from gemla/src/file_linked/mod.rs rename to file_linked/src/lib.rs index 39a85e4..b144d2f 100644 --- a/gemla/src/file_linked/mod.rs +++ b/file_linked/src/lib.rs @@ -1,17 +1,19 @@ //! A wrapper around an object that ties it to a physical file +//! + +extern crate serde; use std::fmt; use std::fs; -use std::io::Read; -use std::io::Write; -use std::str::FromStr; -use std::string::String; -use std::string::ToString; +use std::io::prelude::*; + +use serde::de::DeserializeOwned; +use serde::Serialize; /// A wrapper around an object `T` that ties the object to a physical file pub struct FileLinked where - T: ToString, + T: Serialize, { val: T, path: String, @@ -19,13 +21,13 @@ where impl FileLinked where - T: ToString, + T: Serialize, { /// Returns a readonly reference of `T` /// /// # Examples /// ``` - /// # use gemla::file_linked::*; + /// # use file_linked::*; /// # use serde::{Deserialize, Serialize}; /// # use std::fmt; /// # use std::string::ToString; @@ -37,13 +39,6 @@ where /// # pub c: f64 /// # } /// # - /// # impl ToString for Test { - /// # fn to_string(&self) -> String { - /// # serde_json::to_string(self) - /// # .expect("unable to deserialize") - /// # } - /// # } - /// # /// # fn main() { /// let test = Test { /// a: 1, @@ -69,7 +64,7 @@ where /// /// # Examples /// ``` - /// # use gemla::file_linked::*; + /// # use file_linked::*; /// # use serde::{Deserialize, Serialize}; /// # use std::fmt; /// # use std::string::ToString; @@ -81,13 +76,6 @@ where /// pub c: f64 /// } /// - /// impl ToString for Test { - /// fn to_string(&self) -> String { - /// serde_json::to_string(self) - /// .expect("unable to deserialize") - /// } - /// } - /// /// # fn main() { /// let test = Test { /// a: 1, @@ -121,7 +109,7 @@ where .open(&self.path) .map_err(|_| format!("Unable to open path {}", self.path))?; - write!(file, "{}", self.val.to_string()) + write!(file, "{}", serde_json::to_string(&self.val).map_err(|e| e.to_string())?) .or_else(|_| Err(String::from("Unable to write to file.")))?; Ok(()) @@ -132,7 +120,7 @@ where /// /// # Examples /// ``` - /// # use gemla::file_linked::*; + /// # use file_linked::*; /// # use serde::{Deserialize, Serialize}; /// # use std::fmt; /// # use std::string::ToString; @@ -143,13 +131,6 @@ where /// # pub b: String, /// # pub c: f64 /// # } - /// # - /// # impl ToString for Test { - /// # fn to_string(&self) -> String { - /// # serde_json::to_string(self) - /// # .expect("unable to deserialize") - /// # } - /// # } /// # /// # fn main() -> Result<(), String> { /// let test = Test { @@ -184,7 +165,7 @@ where /// /// # Examples /// ``` - /// # use gemla::file_linked::*; + /// # use file_linked::*; /// # use serde::{Deserialize, Serialize}; /// # use std::fmt; /// # use std::string::ToString; @@ -196,13 +177,6 @@ where /// # pub c: f64 /// # } /// # - /// # impl ToString for Test { - /// # fn to_string(&self) -> String { - /// # serde_json::to_string(self) - /// # .expect("unable to deserialize") - /// # } - /// # } - /// # /// # fn main() -> Result<(), String> { /// let test = Test { /// a: 1, @@ -237,7 +211,7 @@ where impl FileLinked where - T: ToString + FromStr + Default, + T: Serialize + DeserializeOwned + Default, { pub fn from_file(path: &str) -> Result, String> { let meta = fs::metadata(path); @@ -252,7 +226,7 @@ where file.read_to_string(&mut s) .map_err(|_| String::from("Unable to read from file."))?; - let val = T::from_str(&s) + let val = serde_json::from_str(&s) .map_err(|_| String::from("Unable to parse value from file."))?; Ok(FileLinked { @@ -277,7 +251,7 @@ where impl fmt::Display for FileLinked where - T: ToString, + T: Serialize, { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "{}", self.val) @@ -291,30 +265,28 @@ mod tests { #[test] fn test_mutate() -> Result<(), String> { - let tree = btree!(1, btree!(2), btree!(3, btree!(4),)); - let mut linked_tree = FileLinked::new(tree, String::from("test.txt"))?; + let list = vec![1, 2, 3, 4]; + let mut file_linked_list = FileLinked::new(list, String::from("test.txt"))?; assert_eq!( - format!("{}", linked_tree.readonly()), - "{\"val\":1,\"left\":{\"val\":2,\"left\":null,\"right\":null},\"right\":{\"val\":3,\"left\":{\"val\":4,\"left\":null,\"right\":null},\"right\":null}}" + format!("{:?}", file_linked_list.readonly()), + "[1, 2, 3, 4]" ); - linked_tree.mutate(|v1| v1.val = 10)?; + file_linked_list.mutate(|v1| v1.push(5))?; assert_eq!( - format!("{}", linked_tree.readonly()), - "{\"val\":10,\"left\":{\"val\":2,\"left\":null,\"right\":null},\"right\":{\"val\":3,\"left\":{\"val\":4,\"left\":null,\"right\":null},\"right\":null}}" + format!("{:?}", file_linked_list.readonly()), + "[1, 2, 3, 4, 5]" ); - linked_tree.mutate(|v1| { - let mut left = v1.left.clone().unwrap(); - left.val = 13; - v1.left = Some(left); + file_linked_list.mutate(|v1| { + v1[1] = 1 })?; assert_eq!( - format!("{}", linked_tree.readonly()), - "{\"val\":10,\"left\":{\"val\":13,\"left\":null,\"right\":null},\"right\":{\"val\":3,\"left\":{\"val\":4,\"left\":null,\"right\":null},\"right\":null}}" + format!("{:?}", file_linked_list.readonly()), + "[1, 1, 3, 4, 5]" ); fs::remove_file("test.txt").expect("Unable to remove file"); diff --git a/gemla/Cargo.toml b/gemla/Cargo.toml index 4fa771c..1398995 100644 --- a/gemla/Cargo.toml +++ b/gemla/Cargo.toml @@ -10,4 +10,5 @@ serde_json = "1.0" uuid = { version = "0.7", features = ["serde", "v4"] } clap = { version = "~2.27.0", features = ["yaml"] } toml = "0.5.8" -regex = "1" \ No newline at end of file +regex = "1" +file_linked = { path = "../file_linked" } \ No newline at end of file diff --git a/gemla/src/bracket/mod.rs b/gemla/src/bracket/mod.rs index ed030fc..48b04aa 100644 --- a/gemla/src/bracket/mod.rs +++ b/gemla/src/bracket/mod.rs @@ -3,9 +3,9 @@ pub mod genetic_node; -use super::file_linked::FileLinked; use super::tree; +use file_linked::FileLinked; use serde::de::DeserializeOwned; use serde::{Deserialize, Serialize}; use std::fmt; diff --git a/gemla/src/lib.rs b/gemla/src/lib.rs index c11009a..96c5982 100644 --- a/gemla/src/lib.rs +++ b/gemla/src/lib.rs @@ -1,7 +1,7 @@ extern crate regex; +extern crate file_linked; #[macro_use] pub mod tree; pub mod bracket; pub mod constants; -pub mod file_linked;