use std::path::Path; use anyhow::Result; use sha256::try_digest; use crate::model::patch::{Patch, PatchFile, PatchFileVec}; impl PatchFileVec { pub fn new(config_path: impl AsRef) -> Result { let path = config_path.as_ref().join("patches"); if !path.exists() { std::fs::create_dir(&path)?; } std::fs::write(path.join("builtin-chunithm.json5"), include_bytes!("../static/standard-chunithm.json5"))?; let mut res = Vec::new(); for f in std::fs::read_dir(path)? { let f = f?; let f = f.path(); res.push( serde_json5::from_str::(&std::fs::read_to_string(f)?)? ); } Ok(PatchFileVec(res)) } pub fn find_patches(&self, target: impl AsRef) -> Result> { let checksum = try_digest(target.as_ref())?; let mut res = Vec::new(); for pfile in &self.0 { for plist in &pfile.0 { log::debug!("checking {}", plist.sha256); if plist.sha256 == checksum { let mut cloned = plist.clone().patches; res.append(&mut cloned); } } } if res.len() == 0 { log::warn!("no matching patchset for {:?} ({})", target.as_ref(), checksum); } Ok(res) } }