#[derive(Debug,PartialEq)] enum FileState { Open, Closed, } #[derive(Debug)] struct File { name: String, data: Vec, state: FileState, } impl File { fn new(name: &str) -> File { File { name: String::from(name), data: Vec::new(), state: FileState::Closed } } fn read(self: &File, save_to: &mut Vec) -> Result { if self.state != FileState::Open { return Err(String::from("File must be open for reading")); } let mut tmp = self.data.clone(); let read_length = tmp.len(); save_to.reserve(read_length); save_to.append(&mut tmp); Ok(read_length) // <6> } } fn open(mut f: File) -> Result { f.state = FileState::Open; Ok(f) } fn close(mut f: File) -> Result { f.state = FileState::Closed; Ok(f) } fn main() { let mut f5 = File::new("5.txt"); let mut buffer: Vec = vec![]; if f5.read(&mut buffer).is_err() { println!("Error checking is working"); } f5 = open(f5).unwrap(); // <9> let f5_length = f5.read(&mut buffer).unwrap(); // <9> f5 = close(f5).unwrap(); // <9> let text = String::from_utf8_lossy(&buffer); println!("{:?}", f5); println!("{} is {} bytes long", &f5.name, f5_length); println!("{}", text); }