pub mod loader;
pub mod principles;
pub mod types;
pub use loader::{VoiceLoader, VoiceLoaderError};
pub use principles::principles_addendum;
pub use types::{VoiceKnobs, VoiceMeta, VoicePackage, VoiceProvenance, VoiceSection};
#[derive(Debug, Default, Clone)]
pub struct VoiceConfig {
pub principles: Option<String>,
pub voice_addendum: Option<String>,
pub voice_name: Option<String>,
}
impl VoiceConfig {
pub fn default_production() -> Self {
Self {
principles: Some(principles_addendum().to_string()),
voice_addendum: None,
voice_name: None,
}
}
pub fn stock_only() -> Self {
Self::default()
}
pub fn has_any_addendum(&self) -> bool {
self.principles
.as_deref()
.map(|s| !s.is_empty())
.unwrap_or(false)
|| self
.voice_addendum
.as_deref()
.map(|s| !s.is_empty())
.unwrap_or(false)
}
pub fn combined_addendum(&self) -> String {
let mut parts: Vec<&str> = Vec::new();
if let Some(p) = self.principles.as_deref()
&& !p.is_empty()
{
parts.push(p);
}
if let Some(v) = self.voice_addendum.as_deref()
&& !v.is_empty()
{
parts.push(v);
}
parts.join("\n\n")
}
}
#[cfg(test)]
#[path = "tests.rs"]
mod tests;
#[cfg(test)]
#[path = "tests_voice_config.rs"]
mod tests_voice_config;
#[cfg(test)]
#[path = "tests_integration.rs"]
mod tests_integration;