use std::path::Path; use anyhow::Result; use crate::model::patch::{Patch, PatchData, PatchFileVec, PatchSelection, PatchSelectionData}; impl PatchSelection { pub async fn render_to_file( &self, filename: &str, patches: &PatchFileVec, path: impl AsRef ) -> Result<()> { let mut res = "".to_owned(); for file in &patches.0 { for list in &file.0 { if list.filename != filename { continue; } for patch in &list.patches { if let Some(selection) = self.0.get(&patch.id) { res += &Self::render(filename, patch, selection); } } } } tokio::fs::write(path, res).await?; Ok(()) } fn render(filename: &str, patch: &Patch, sel: &PatchSelectionData) -> String { let mut res = "".to_owned(); match &patch.data { PatchData::Normal(data) => { for p in &data.patches { res += &format!("{} F+{:X} ", filename, p.offset); for on in &p.on { res += &format!("{:02X}", on); } res += " "; for off in &p.off { res += &format!("{:02X}", off); } res += "\n"; } }, PatchData::Number(data) => { if let PatchSelectionData::Number(val) = sel { let width = (data.size as usize) * 2usize; res += &format!("{} F+{:X} {:0width$X} {:0width$X}", filename, data.offset, val, data.default, width = width); } else { log::error!("invalid number patch {:?}", patch); } } } format!("{}\n", res) } }