use std::path::PathBuf;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PiperOptions {
pub model_id: Option<String>,
pub speaker_id: Option<u32>,
pub sample_rate: Option<u32>,
pub cache_dir: Option<PathBuf>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_options_all_none() {
let opts = PiperOptions::default();
assert!(opts.model_id.is_none());
assert!(opts.speaker_id.is_none());
assert!(opts.sample_rate.is_none());
assert!(opts.cache_dir.is_none());
}
#[test]
fn struct_update_syntax_works() {
let opts = PiperOptions {
model_id: Some("en_US-amy-medium".into()),
sample_rate: Some(22050),
..PiperOptions::default()
};
assert_eq!(opts.model_id.as_deref(), Some("en_US-amy-medium"));
assert_eq!(opts.sample_rate, Some(22050));
assert!(opts.speaker_id.is_none());
}
#[test]
fn serde_roundtrip() {
let opts = PiperOptions {
model_id: Some("en_US-amy-medium".into()),
speaker_id: Some(3),
sample_rate: Some(22050),
cache_dir: Some(PathBuf::from("/tmp/piper-cache")),
};
let json = serde_json::to_string(&opts).expect("serialize");
let parsed: PiperOptions = serde_json::from_str(&json).expect("deserialize");
assert_eq!(parsed.model_id.as_deref(), Some("en_US-amy-medium"));
assert_eq!(parsed.speaker_id, Some(3));
assert_eq!(parsed.sample_rate, Some(22050));
assert_eq!(
parsed.cache_dir.as_deref(),
Some(std::path::Path::new("/tmp/piper-cache"))
);
}
}