use serde::{Deserialize, Serialize};
use std::error::Error;
use std::fs;
use std::path::Path;
pub trait EstimationMethod {
type Features;
type Parameters: Serialize + for<'de> Deserialize<'de> + Default;
fn count(&self, text: &str) -> Self::Features;
fn estimate(&self, text: &str) -> usize;
fn parameters(&self) -> Self::Parameters;
fn set_parameters(&mut self, params: Self::Parameters);
fn load_parameters(&mut self, path: &Path) -> Result<(), Box<dyn Error>> {
let content = fs::read_to_string(path)?;
let params: Self::Parameters = toml::from_str(&content)?;
self.set_parameters(params);
Ok(())
}
fn save_parameters(&self, path: &Path) -> Result<(), Box<dyn Error>> {
let params = self.parameters();
let content = toml::to_string_pretty(¶ms)?;
fs::write(path, content)?;
Ok(())
}
}