From 9662155604b4b67a1f82d2253d1cdcf4bcc30ba9 Mon Sep 17 00:00:00 2001 From: vandomej Date: Sat, 4 Sep 2021 23:43:42 -0700 Subject: [PATCH] Changing file write to use buffer --- file_linked/src/lib.rs | 60 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 54 insertions(+), 6 deletions(-) diff --git a/file_linked/src/lib.rs b/file_linked/src/lib.rs index b144d2f..e05cc18 100644 --- a/file_linked/src/lib.rs +++ b/file_linked/src/lib.rs @@ -1,5 +1,4 @@ //! A wrapper around an object that ties it to a physical file -//! extern crate serde; @@ -213,20 +212,69 @@ impl FileLinked where T: Serialize + DeserializeOwned + Default, { + /// Deserializes an object `T` from the file given by `path` + /// + /// # Examples + /// ``` + /// # use file_linked::*; + /// # use serde::{Deserialize, Serialize}; + /// # use std::fmt; + /// # use std::string::ToString; + /// # use std::fs; + /// # use std::fs::OpenOptions; + /// # use std::io::Write; + /// # + /// # #[derive(Deserialize, Serialize, Default)] + /// # struct Test { + /// # pub a: u32, + /// # pub b: String, + /// # pub c: f64 + /// # } + /// # + /// # fn main() -> Result<(), String> { + /// let test = Test { + /// a: 1, + /// b: String::from("2"), + /// c: 3.0 + /// }; + /// + /// let path = String::from("./temp"); + /// + /// let mut file = OpenOptions::new() + /// .write(true) + /// .create(true) + /// .open(path.clone()) + /// .expect("Unable to create file"); + /// + /// write!(file, "{}", serde_json::to_string(&test) + /// .expect("Unable to serialize object")) + /// .expect("Unable to write file"); + /// + /// drop(file); + /// + /// let mut linked_test = FileLinked::::from_file(&path) + /// .expect("Unable to create file linked object"); + /// + /// assert_eq!(linked_test.readonly().a, test.a); + /// assert_eq!(linked_test.readonly().b, test.b); + /// assert_eq!(linked_test.readonly().c, test.c); + /// # + /// # std::fs::remove_file("./temp").expect("Unable to remove file"); + /// # + /// # Ok(()) + /// # } + /// ``` pub fn from_file(path: &str) -> Result, String> { let meta = fs::metadata(path); match &meta { Ok(m) if m.is_file() => { - let mut file = fs::OpenOptions::new() + let file = fs::OpenOptions::new() .read(true) .open(path) .map_err(|_| format!("Unable to open file {}", path))?; - let mut s = String::new(); - file.read_to_string(&mut s) - .map_err(|_| String::from("Unable to read from file."))?; - let val = serde_json::from_str(&s) + let val = serde_json::from_reader(file) .map_err(|_| String::from("Unable to parse value from file."))?; Ok(FileLinked {