summaryrefslogtreecommitdiff
path: root/meap/meap-code/ch3/ch3-not-quite-file-4.rs
diff options
context:
space:
mode:
Diffstat (limited to 'meap/meap-code/ch3/ch3-not-quite-file-4.rs')
-rwxr-xr-xmeap/meap-code/ch3/ch3-not-quite-file-4.rs42
1 files changed, 42 insertions, 0 deletions
diff --git a/meap/meap-code/ch3/ch3-not-quite-file-4.rs b/meap/meap-code/ch3/ch3-not-quite-file-4.rs
new file mode 100755
index 0000000..4c3dbfd
--- /dev/null
+++ b/meap/meap-code/ch3/ch3-not-quite-file-4.rs
@@ -0,0 +1,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);
+} \ No newline at end of file