use crate::fleet_ensure::model::DesiredFleet;
use canic_core::cdk::utils::hash::sha256_hex;
use std::{fs, io, path::Path};
use thiserror::Error as ThisError;
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct LoadedDesiredFleet {
pub desired: DesiredFleet,
pub sha256: String,
}
#[derive(Debug, ThisError)]
pub enum DesiredFleetLoadError {
#[error("failed to read desired Fleet document {}: {source}", path.display())]
Read {
path: std::path::PathBuf,
#[source]
source: io::Error,
},
#[error("failed to parse desired Fleet document {}: {source}", path.display())]
Parse {
path: std::path::PathBuf,
#[source]
source: toml::de::Error,
},
}
pub fn load_desired_fleet(path: &Path) -> Result<LoadedDesiredFleet, DesiredFleetLoadError> {
let bytes = fs::read(path).map_err(|source| DesiredFleetLoadError::Read {
path: path.to_path_buf(),
source,
})?;
let desired = toml::from_slice::<DesiredFleet>(&bytes).map_err(|source| {
DesiredFleetLoadError::Parse {
path: path.to_path_buf(),
source,
}
})?;
Ok(LoadedDesiredFleet {
desired,
sha256: sha256_hex(&bytes),
})
}