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);
}
}
|