From 7e8ee5ed9cad6484e9f13f81731b102ced58402e Mon Sep 17 00:00:00 2001 From: Adam Carpenter Date: Tue, 9 Jul 2019 15:14:04 -0400 Subject: Init. --- meap/meap-code/ch3/ch3-file-states.rs | 59 +++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100755 meap/meap-code/ch3/ch3-file-states.rs (limited to 'meap/meap-code/ch3/ch3-file-states.rs') diff --git a/meap/meap-code/ch3/ch3-file-states.rs b/meap/meap-code/ch3/ch3-file-states.rs new file mode 100755 index 0000000..36510a5 --- /dev/null +++ b/meap/meap-code/ch3/ch3-file-states.rs @@ -0,0 +1,59 @@ +#[derive(Debug,PartialEq)] +enum FileState { + Open, + Closed, +} + +#[derive(Debug)] +struct File { + name: String, + data: Vec, + state: FileState, +} + +impl File { + fn new(name: &str) -> File { + File { name: String::from(name), data: Vec::new(), state: FileState::Closed } + } + + fn read(self: &File, save_to: &mut Vec) -> Result { + if self.state != FileState::Open { + return Err(String::from("File must be open for reading")); + } + let mut tmp = self.data.clone(); + let read_length = tmp.len(); + save_to.reserve(read_length); + save_to.append(&mut tmp); + Ok(read_length) // <6> + } +} + +fn open(mut f: File) -> Result { + f.state = FileState::Open; + Ok(f) +} + +fn close(mut f: File) -> Result { + f.state = FileState::Closed; + Ok(f) +} + +fn main() { + let mut f5 = File::new("5.txt"); + + let mut buffer: Vec = vec![]; + + if f5.read(&mut buffer).is_err() { + println!("Error checking is working"); + } + + f5 = open(f5).unwrap(); // <9> + let f5_length = f5.read(&mut buffer).unwrap(); // <9> + f5 = close(f5).unwrap(); // <9> + + let text = String::from_utf8_lossy(&buffer); + + println!("{:?}", f5); + println!("{} is {} bytes long", &f5.name, f5_length); + println!("{}", text); +} \ No newline at end of file -- cgit v1.2.3