From feadba1a65dcbd6233e1e547f980c3981d65bb93 Mon Sep 17 00:00:00 2001 From: Jacob VanDomelen Date: Fri, 31 May 2019 23:07:13 -0700 Subject: [PATCH] #1 Finished FileLinked implementation. --- gemla/src/bracket/mod.rs | 10 +++-- gemla/src/file_linked/mod.rs | 75 ++++++++++++++++++++++++------------ gemla/src/main.rs | 5 +++ gemla/src/tree/mod.rs | 1 + 4 files changed, 63 insertions(+), 28 deletions(-) diff --git a/gemla/src/bracket/mod.rs b/gemla/src/bracket/mod.rs index ae77763..49f7ffb 100644 --- a/gemla/src/bracket/mod.rs +++ b/gemla/src/bracket/mod.rs @@ -1,6 +1,7 @@ mod state; use super::tree; +use super::file_linked::FileLinked; use uuid::Uuid; use std::str::FromStr; @@ -40,15 +41,18 @@ fn build_tree(h: u32) -> Option>> { /// TODO: Explain reasoning for bracket system against genetic algorithm. pub fn run_bracket() { let mut height = 1; - let mut tree: tree::Tree = *build_tree(height).expect("Error getting result from build_tree."); + let mut tree = FileLinked::new(*build_tree(height).expect("Error getting result from build_tree"), "temp") + .expect("Unable to create file linked object from tree"); + // Building tree one node at a time, appending to the top. loop { println!("========================================="); println!("Running bracket..."); height += 1; - tree = tree::Tree::new(Uuid::new_v4(), Some(Box::new(tree)), build_tree(height)); - tree.run_simulation(); + tree.replace(tree::Tree::new(Uuid::new_v4(), Some(Box::new(tree.readonly().clone())), build_tree(height))) + .expect("Error building up tree node"); + tree.readonly().run_simulation(); if height == 3 { println!("{}\n\n", tree); diff --git a/gemla/src/file_linked/mod.rs b/gemla/src/file_linked/mod.rs index 378bbff..3d6ed39 100644 --- a/gemla/src/file_linked/mod.rs +++ b/gemla/src/file_linked/mod.rs @@ -1,6 +1,6 @@ use std::fs; use std::str::FromStr; -use std::fmt::Display; +use std::fmt; use std::string::String; use std::io::Read; use std::io::Write; @@ -10,44 +10,57 @@ pub struct FileLinked { path: String } -impl FileLinked { +impl FileLinked where T: FromStr + fmt::Display + Default { pub fn from_file(path: &str) -> Result, String> { - let meta = fs::metadata(path) - .or(Err(format!("Path {} does not exist.", path)))?; - - if meta.is_file() { - let mut file = fs::OpenOptions::new().read(true).open(path) - .or(Err(format!("Unable to open file {}", path)))?; - let mut s = String::new(); - file.read_to_string(&mut s) - .or(Err(String::from("Unable to read from file.")))?; + let meta = fs::metadata(path); - let val = T::from_str(&s).or(Err(String::from("Unable to parse value from file.")))?; + match &meta { + Ok(m) if m.is_file() => { + let mut file = fs::OpenOptions::new().read(true).open(path) + .or(Err(format!("Unable to open file {}", path)))?; + let mut s = String::new(); + file.read_to_string(&mut s) + .or(Err(String::from("Unable to read from file.")))?; - Ok(FileLinked { - val, - path: String::from(path) - }) - } else { - Err(format!("{} is not a file.", path)) + let val = T::from_str(&s).or(Err(String::from("Unable to parse value from file.")))?; + + Ok(FileLinked { + val, + path: String::from(path) + }) + }, + Ok(_) => { + Err(format!("{} is not a file.", path)) + }, + _ => { + let result = FileLinked { + val: T::default(), + path: String::from(path) + }; + + result.write_data()?; + + Ok(result) + } } } - pub fn new(val: T, path: &str) -> FileLinked { + pub fn new(val: T, path: &str) -> Result, String> { let result = FileLinked { val, path: String::from(path) }; - result.write_data(); + result.write_data()?; - result + Ok(result) } pub fn write_data(&self) -> Result<(), String> { let mut file = fs::OpenOptions::new() .write(true) - .create_new(true) + .create(true) + .truncate(true) .open(&self.path) .or(Err(format!("Unable to open path {}", self.path)))?; @@ -61,11 +74,23 @@ impl FileLinked { &self.val } - pub fn mutate U>(&mut self, op: F) -> U { + pub fn mutate U>(&mut self, op: F) -> Result { let result = op(&mut self.val); - self.write_data(); + self.write_data()?; - result + Ok(result) + } + + pub fn replace(&mut self, val: T) -> Result<(), String>{ + self.val = val; + + self.write_data() + } +} + +impl fmt::Display for FileLinked { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", self.val) } } \ No newline at end of file diff --git a/gemla/src/main.rs b/gemla/src/main.rs index 9abefcf..af13f13 100644 --- a/gemla/src/main.rs +++ b/gemla/src/main.rs @@ -28,6 +28,11 @@ fn main() { println!("{} is a valid directory!", directory); println!("Building tree for {}.", directory); bracket::run_bracket(); + + println!("\n\nReading tree from temp file."); + let tree: file_linked::FileLinked> = file_linked::FileLinked::from_file("temp") + .expect("Unable to read tree from existing file"); + println!("Value read from file:\n{}", tree); }, Ok(_) => println!("{} is not a valid directory!", directory), _ => println!("{} does not exist!", directory) diff --git a/gemla/src/tree/mod.rs b/gemla/src/tree/mod.rs index 6f2b5d4..464ce4a 100644 --- a/gemla/src/tree/mod.rs +++ b/gemla/src/tree/mod.rs @@ -2,6 +2,7 @@ use std::fmt; use std::str::FromStr; use regex::Regex; +#[derive(Default, Clone)] pub struct Tree { pub val: T, pub left: Option>>,