use std::path::Path;
use typesayer_types::error::Result;
pub fn save_module_to_path(module: &dyn crate::module::Module, path: &Path) -> Result<()> {
let predictors = module.named_predictors();
let mut state = serde_json::Map::new();
for (name, predict) in predictors {
let predictor_state = predict.dump_state()?;
state.insert(name, predictor_state);
}
state.insert(
"metadata".to_owned(),
serde_json::json!({
"dependency_versions": {
"typesayer": env!("CARGO_PKG_VERSION"),
}
}),
);
let json = serde_json::to_string_pretty(&serde_json::Value::Object(state))?;
std::fs::write(path, json)?;
Ok(())
}
pub fn load_module_from_path(module: &mut dyn crate::module::Module, path: &Path) -> Result<()> {
let json = std::fs::read_to_string(path)?;
let state: serde_json::Value = serde_json::from_str(&json)?;
let state_obj = state.as_object().ok_or_else(|| {
typesayer_types::PredictError::invalid_signature("module state must be a JSON object")
})?;
for (name, predict) in module.named_predictors_mut() {
if let Some(predictor_state) = state_obj.get(&name) {
predict.load_state(predictor_state)?;
}
}
Ok(())
}