diff --git a/day_04/src/crossword.rs b/day_04/src/crossword.rs new file mode 100644 index 0000000..229e6e9 --- /dev/null +++ b/day_04/src/crossword.rs @@ -0,0 +1,57 @@ +use std::error::Error; +use std::fmt::Display; +use std::fs::File; +use std::io::{BufReader, prelude::*}; + +#[derive(Debug)] +pub struct Crossword { + data: Vec>, + width: usize, + height: usize, +} + +impl Crossword { + pub fn new(file: File) -> Result> { + let mut input_buffer = BufReader::new(file); + + let mut data: Vec> = Vec::new(); + + let mut first_line = String::new(); + input_buffer.read_line(&mut first_line)?; + let first_line = first_line.trim_end().to_owned(); + let width = first_line.len(); + for line in input_buffer.lines() { + let line = line?; + if line.len() != width { + println!("{}", line); + Err("Line length of input are not consistent")?; + } + data.push(line.chars().collect()); + } + let height = data.len(); + + Ok(Crossword { + data, + width, + height, + }) + } + + pub fn width(&self) -> usize { + self.width + } + + pub fn height(&self) -> usize { + self.height + } +} + +impl Display for Crossword { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + for row in &self.data { + let row = String::from_iter(row.iter()); + writeln!(f, "{}", row)?; + } + Ok(()) + } +} diff --git a/day_04/src/main.rs b/day_04/src/main.rs index 65bbf3f..b5f6060 100644 --- a/day_04/src/main.rs +++ b/day_04/src/main.rs @@ -4,54 +4,11 @@ use std::env; use std::error::Error; -use std::fmt::Display; use std::fs::File; -use std::io::{BufReader, prelude::*}; -#[derive(Debug)] -struct Crossword { - data: Vec>, - width: usize, - height: usize, -} +mod crossword; -impl Crossword { - fn new(file: File) -> Result> { - let mut input_buffer = BufReader::new(file); - - let mut data: Vec> = Vec::new(); - - let mut first_line = String::new(); - input_buffer.read_line(&mut first_line)?; - let first_line = first_line.trim_end().to_owned(); - let width = first_line.len(); - for line in input_buffer.lines() { - let line = line?; - if line.len() != width { - println!("{}", line); - Err("Line length of input are not consistent")?; - } - data.push(line.chars().collect()); - } - let height = data.len(); - - Ok(Crossword { - data, - width, - height, - }) - } -} - -impl Display for Crossword { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - for row in &self.data { - let row = String::from_iter(row.iter()); - writeln!(f, "{}", row)?; - } - Ok(()) - } -} +use crate::crossword::Crossword; fn main() -> Result<(), Box> { // Handle command input