Move file IO functions in EditorBuffer to io submodule
This commit is contained in:
parent
1634e64ebf
commit
acd456c22a
|
|
@ -0,0 +1,84 @@
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
use super::{CommandResponse, EditorBuffer};
|
||||||
|
use crate::{Point, TextBuffer, TextBufferWriter};
|
||||||
|
|
||||||
|
impl EditorBuffer {
|
||||||
|
pub fn open_file(&mut self, filepath: PathBuf) -> CommandResponse {
|
||||||
|
match std::fs::File::open(&filepath) {
|
||||||
|
Ok(mut file) => {
|
||||||
|
let mut buffer = TextBuffer::new();
|
||||||
|
match std::io::copy(&mut file, &mut TextBufferWriter::new(&mut buffer)) {
|
||||||
|
Ok(bytes_read) => {
|
||||||
|
let msg = format!(
|
||||||
|
"Read {bytes_read} bytes from \"{}\"",
|
||||||
|
filepath.to_string_lossy()
|
||||||
|
);
|
||||||
|
self.filepath = Some(filepath);
|
||||||
|
self.cursor = Point::default();
|
||||||
|
self.buffer = buffer;
|
||||||
|
CommandResponse::Success(msg)
|
||||||
|
}
|
||||||
|
Err(err) => CommandResponse::Failure(format!("{}", err)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(err) => {
|
||||||
|
if err.kind() == std::io::ErrorKind::NotFound {
|
||||||
|
CommandResponse::Failure(format!(
|
||||||
|
"File not found: \"{}\"",
|
||||||
|
filepath.to_string_lossy()
|
||||||
|
))
|
||||||
|
} else {
|
||||||
|
CommandResponse::Failure(format!("{}", err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn save_file(&mut self, _filepath: Option<PathBuf>) -> CommandResponse {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use crate::{Command, CommandResponse, TextBufferReader, EditorBuffer};
|
||||||
|
use std::io::Read;
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn load_file_loads_expected_contents() {
|
||||||
|
let test_file_path: PathBuf = [
|
||||||
|
env!("CARGO_MANIFEST_DIR"),
|
||||||
|
r"test_data/Les_Trois_Mousquetaires.txt",
|
||||||
|
]
|
||||||
|
.iter()
|
||||||
|
.collect();
|
||||||
|
let expected_text = std::fs::read_to_string(&test_file_path).unwrap();
|
||||||
|
let mut target = EditorBuffer::new();
|
||||||
|
assert!(matches!(
|
||||||
|
target.execute(Command::OpenFile(test_file_path)),
|
||||||
|
CommandResponse::Success(_)
|
||||||
|
));
|
||||||
|
|
||||||
|
let mut buffer_bytes = Vec::new();
|
||||||
|
TextBufferReader::new(&target.buffer)
|
||||||
|
.read_to_end(&mut buffer_bytes)
|
||||||
|
.unwrap();
|
||||||
|
let buffer_text = String::from_utf8(buffer_bytes).unwrap();
|
||||||
|
assert_eq!(&expected_text, &buffer_text);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn load_file_reports_error_with_missing_file() {
|
||||||
|
let test_file_path: PathBuf = [env!("CARGO_MANIFEST_DIR"), r"test_data/Not_a_File.txt"]
|
||||||
|
.iter()
|
||||||
|
.collect();
|
||||||
|
let expected_message = format!("File not found: \"{}\"", test_file_path.to_string_lossy());
|
||||||
|
let mut target = EditorBuffer::new();
|
||||||
|
match target.execute(Command::OpenFile(test_file_path)) {
|
||||||
|
CommandResponse::Failure(s) => assert_eq!(expected_message, s),
|
||||||
|
_ => panic!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2,6 +2,7 @@ use std::path::PathBuf;
|
||||||
|
|
||||||
use crate::{Point, TextBuffer, TextBufferWriter};
|
use crate::{Point, TextBuffer, TextBufferWriter};
|
||||||
|
|
||||||
|
mod io;
|
||||||
mod command;
|
mod command;
|
||||||
pub use command::{Command, Movement, Unit};
|
pub use command::{Command, Movement, Unit};
|
||||||
|
|
||||||
|
|
@ -39,41 +40,6 @@ impl EditorBuffer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn open_file(&mut self, filepath: PathBuf) -> CommandResponse {
|
|
||||||
match std::fs::File::open(&filepath) {
|
|
||||||
Ok(mut file) => {
|
|
||||||
let mut buffer = TextBuffer::new();
|
|
||||||
match std::io::copy(&mut file, &mut TextBufferWriter::new(&mut buffer)) {
|
|
||||||
Ok(bytes_read) => {
|
|
||||||
let msg = format!(
|
|
||||||
"Read {bytes_read} bytes from \"{}\"",
|
|
||||||
filepath.to_string_lossy()
|
|
||||||
);
|
|
||||||
self.filepath = Some(filepath);
|
|
||||||
self.cursor = Point::default();
|
|
||||||
self.buffer = buffer;
|
|
||||||
CommandResponse::Success(msg)
|
|
||||||
}
|
|
||||||
Err(err) => CommandResponse::Failure(format!("{}", err)),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Err(err) => {
|
|
||||||
if err.kind() == std::io::ErrorKind::NotFound {
|
|
||||||
CommandResponse::Failure(format!(
|
|
||||||
"File not found: \"{}\"",
|
|
||||||
filepath.to_string_lossy()
|
|
||||||
))
|
|
||||||
} else {
|
|
||||||
CommandResponse::Failure(format!("{}", err))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn save_file(&mut self, _filepath: Option<PathBuf>) -> CommandResponse {
|
|
||||||
todo!()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn move_cursor_to_point(&mut self, _point: Point) -> CommandResponse {
|
fn move_cursor_to_point(&mut self, _point: Point) -> CommandResponse {
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
|
|
@ -98,46 +64,3 @@ impl EditorBuffer {
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use super::*;
|
|
||||||
use crate::TextBufferReader;
|
|
||||||
use std::io::Read;
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn load_file_loads_expected_contents() {
|
|
||||||
let test_file_path: PathBuf = [
|
|
||||||
env!("CARGO_MANIFEST_DIR"),
|
|
||||||
r"test_data/Les_Trois_Mousquetaires.txt",
|
|
||||||
]
|
|
||||||
.iter()
|
|
||||||
.collect();
|
|
||||||
let expected_text = std::fs::read_to_string(&test_file_path).unwrap();
|
|
||||||
let mut target = EditorBuffer::new();
|
|
||||||
assert!(matches!(
|
|
||||||
target.execute(Command::OpenFile(test_file_path)),
|
|
||||||
CommandResponse::Success(_)
|
|
||||||
));
|
|
||||||
|
|
||||||
let mut buffer_bytes = Vec::new();
|
|
||||||
TextBufferReader::new(&target.buffer)
|
|
||||||
.read_to_end(&mut buffer_bytes)
|
|
||||||
.unwrap();
|
|
||||||
let buffer_text = String::from_utf8(buffer_bytes).unwrap();
|
|
||||||
assert_eq!(&expected_text, &buffer_text);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn load_file_reports_error_with_missing_file() {
|
|
||||||
let test_file_path: PathBuf = [env!("CARGO_MANIFEST_DIR"), r"test_data/Not_a_File.txt"]
|
|
||||||
.iter()
|
|
||||||
.collect();
|
|
||||||
let expected_message = format!("File not found: \"{}\"", test_file_path.to_string_lossy());
|
|
||||||
let mut target = EditorBuffer::new();
|
|
||||||
match target.execute(Command::OpenFile(test_file_path)) {
|
|
||||||
CommandResponse::Failure(s) => assert_eq!(expected_message, s),
|
|
||||||
_ => panic!(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
mod text_buffer;
|
mod text_buffer;
|
||||||
pub use text_buffer::{Point, TextBuffer, TextBufferReader, TextBufferWriter};
|
pub use text_buffer::{Point, TextBuffer, TextBufferReader, TextBufferWriter};
|
||||||
mod editor_buffer;
|
mod editor_buffer;
|
||||||
pub use editor_buffer::{Command,EditorBuffer};
|
pub use editor_buffer::{Command, CommandResponse, EditorBuffer};
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue