From 4250ef35134b9a090cd14ca85c560b2c966b553e Mon Sep 17 00:00:00 2001 From: Rosyid Haryadi Date: Wed, 26 Feb 2025 13:25:47 +0700 Subject: refactor: files separation --- src/view.rs | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/view.rs (limited to 'src/view.rs') diff --git a/src/view.rs b/src/view.rs new file mode 100644 index 0000000..e4a09b1 --- /dev/null +++ b/src/view.rs @@ -0,0 +1,42 @@ +use std::fs::File; +use std::io::Write; +use crate::global::{DisplayBuffer, IMG_HEIGHT, IMG_WIDTH}; + +pub struct View<'a> { + pub data: &'a DisplayBuffer, + pub viewer: fn(&DisplayBuffer) -> Result, +} + +impl<'a> View<'a> { + pub fn display(&self) { + let result = (self.viewer)(self.data); + match result { + Ok(success_msg) => { + println!("{}", success_msg); + }, + Err(error_msg) => { + eprintln!("{}", error_msg); + } + } + } +} + +pub mod render_viewer { + use super::*; + + pub fn ppm_exporter(data: &DisplayBuffer) -> Result { + let file_name = "output.ppm"; + let mut file = File::create(file_name)?; + // header + let mut txt_data = String::from("P3\n"); + txt_data.push_str(format!("{} {}\n255\n", IMG_WIDTH, IMG_HEIGHT).as_str()); + // data point + data.iter().for_each(|row| { + row.iter().for_each(|&pixel| { + txt_data.push_str(&format!("{} {} {}\n", pixel.r, pixel.g, pixel.b)); + }) + }); + file.write_all(txt_data.as_bytes())?; + Ok(format!("Output rendered to file {}", file_name)) + } +} -- cgit v1.2.3-70-g09d2