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-files-with-modes.rs | 75 ++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100755 meap/meap-code/ch3/ch3-files-with-modes.rs (limited to 'meap/meap-code/ch3/ch3-files-with-modes.rs') diff --git a/meap/meap-code/ch3/ch3-files-with-modes.rs b/meap/meap-code/ch3/ch3-files-with-modes.rs new file mode 100755 index 0000000..4440924 --- /dev/null +++ b/meap/meap-code/ch3/ch3-files-with-modes.rs @@ -0,0 +1,75 @@ +#[derive(Debug)] +pub enum FileOpenMode { + Read, + Write, + Append, + Truncate, +} + +#[derive(Debug)] +pub enum FileHandle { + Handle(usize), + None, +} + +#[derive(Debug)] +pub enum FileState { + PendingCreation, + Created(FileOpenMode), + Opened(FileOpenMode), + Error(String), + Closed, + Deleted, +} + +#[derive(Debug)] +pub struct File { + name: String, + data: Vec, + state: FileState, + handle: FileHandle, +} + +impl File { + pub fn new(name: &str) -> File { + File { + name: String::from(name), + data: Vec::new(), + state: FileState::PendingCreation, // <1> + handle: FileHandle::None, // <1> + } + } + + pub fn from_options(name: &str, state: FileState, handle: FileHandle) -> File { + File { + name: String::from(name), + data: Vec::new(), + state: state, + handle: handle, + } + } +} + +fn main() { + let f1 = File::new("f1.txt"); + let f2 = File::from_options("f2.txt", + FileState::Opened(FileOpenMode::Read), + FileHandle::Handle(123) + ); + let f3 = File::from_options("f3.txt", + FileState::Opened(FileOpenMode::Write), + FileHandle::None + ); + + let mut files = [f1, f2, f3]; + + for f in &files { + println!("{:?}", f); + } + + // uh oh, disk failure + for ref mut f in &mut files { + f.state = FileState::Error(String::from("disk read failure")); + println!("{:?}", f); + } +} \ No newline at end of file -- cgit v1.2.3