summaryrefslogtreecommitdiff
path: root/meap/meap-code/ch3/ch3-not-quite-file-4.rs
blob: 4c3dbfdda0271a07efcfe62b080fb1226b4e3e54 (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
#[derive(Debug)] // <1>
struct File {
  name: String,
  data: Vec<u8>, // <2>
  state: &'static str,
}

type FileMode = &'static str;

const OPEN: FileMode = "open";
const CLOSED: FileMode = "closed";

fn open(f: &mut File) -> bool {
    f.state = OPEN;
    true // <3> let's assume for the moment that this always succeeds
}

fn close(f: &mut File) -> bool {
    f.state = CLOSED;
    true // <3>
}

fn read(f: &File) -> (usize, Vec<u8>) {
    (f.data.len(), f.data.clone())
}

fn main() {
  let mut f2 = File { 
    name: String::from("2.txt"), // <3>
    data: vec![],
    state: CLOSED,
  };

  let f2_name = &f2.name.clone(); // <5>

  open(&mut f2);
  let (f2_length, _) = read(&f2);
  close(&mut f2);
  
  println!("{:?}", f2);
  println!("{} is {} bytes long", f2_name, f2_length);
}