summaryrefslogtreecommitdiff
path: root/meap/meap-code/ch3/ch3-files-with-modes.rs
blob: 44409248423cf4e526b804b36760f8274b3d3b34 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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<u8>,
  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);
  }
}