use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum PipelineSource {
Yaml,
Bundle,
Registry,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum InputType {
Audio,
Text,
Image,
Embedding,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum OutputType {
Text,
Embedding,
Audio,
Image,
Json,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum AudioSampleFormat {
Pcm16,
Pcm32,
Float32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AudioInputConfig {
pub sample_rate: u32,
pub channels: u32,
pub format: AudioSampleFormat,
pub streaming: bool,
}
impl Default for AudioInputConfig {
fn default() -> Self {
Self {
sample_rate: 16000,
channels: 1,
format: AudioSampleFormat::Float32,
streaming: false,
}
}
}
impl AudioInputConfig {
pub fn new(
sample_rate: u32,
channels: u32,
format: AudioSampleFormat,
streaming: bool,
) -> Self {
Self {
sample_rate,
channels,
format,
streaming,
}
}
pub fn asr_default() -> Self {
Self::default()
}
pub fn asr_streaming() -> Self {
Self {
streaming: true,
..Self::default()
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TextInputConfig {
pub max_length: Option<u32>,
pub encoding: String,
}
impl Default for TextInputConfig {
fn default() -> Self {
Self {
max_length: None,
encoding: "utf8".to_string(),
}
}
}
impl TextInputConfig {
pub fn new(max_length: Option<u32>, encoding: impl Into<String>) -> Self {
Self {
max_length,
encoding: encoding.into(),
}
}
pub fn llm_default(max_tokens: u32) -> Self {
Self {
max_length: Some(max_tokens * 4), encoding: "utf8".to_string(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum InputConfig {
Audio(AudioInputConfig),
Text(TextInputConfig),
}
impl InputConfig {
pub fn input_type(&self) -> InputType {
match self {
InputConfig::Audio(_) => InputType::Audio,
InputConfig::Text(_) => InputType::Text,
}
}
pub fn as_audio(&self) -> Option<&AudioInputConfig> {
match self {
InputConfig::Audio(config) => Some(config),
_ => None,
}
}
pub fn as_text(&self) -> Option<&TextInputConfig> {
match self {
InputConfig::Text(config) => Some(config),
_ => None,
}
}
}
impl Default for InputConfig {
fn default() -> Self {
InputConfig::Audio(AudioInputConfig::default())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_pipeline_source_serialization() {
let source = PipelineSource::Bundle;
let json = serde_json::to_string(&source).unwrap();
assert_eq!(json, "\"Bundle\"");
let parsed: PipelineSource = serde_json::from_str(&json).unwrap();
assert_eq!(parsed, PipelineSource::Bundle);
}
#[test]
fn test_input_type_serialization() {
let input = InputType::Audio;
let json = serde_json::to_string(&input).unwrap();
assert_eq!(json, "\"Audio\"");
let parsed: InputType = serde_json::from_str(&json).unwrap();
assert_eq!(parsed, InputType::Audio);
}
#[test]
fn test_output_type_serialization() {
let output = OutputType::Text;
let json = serde_json::to_string(&output).unwrap();
assert_eq!(json, "\"Text\"");
let parsed: OutputType = serde_json::from_str(&json).unwrap();
assert_eq!(parsed, OutputType::Text);
}
#[test]
fn test_audio_sample_format_serialization() {
let format = AudioSampleFormat::Float32;
let json = serde_json::to_string(&format).unwrap();
assert_eq!(json, "\"Float32\"");
let parsed: AudioSampleFormat = serde_json::from_str(&json).unwrap();
assert_eq!(parsed, AudioSampleFormat::Float32);
}
#[test]
fn test_all_pipeline_sources() {
assert_eq!(
serde_json::to_string(&PipelineSource::Yaml).unwrap(),
"\"Yaml\""
);
assert_eq!(
serde_json::to_string(&PipelineSource::Bundle).unwrap(),
"\"Bundle\""
);
assert_eq!(
serde_json::to_string(&PipelineSource::Registry).unwrap(),
"\"Registry\""
);
}
#[test]
fn test_all_input_types() {
assert_eq!(
serde_json::to_string(&InputType::Audio).unwrap(),
"\"Audio\""
);
assert_eq!(serde_json::to_string(&InputType::Text).unwrap(), "\"Text\"");
assert_eq!(
serde_json::to_string(&InputType::Image).unwrap(),
"\"Image\""
);
assert_eq!(
serde_json::to_string(&InputType::Embedding).unwrap(),
"\"Embedding\""
);
}
#[test]
fn test_all_output_types() {
assert_eq!(
serde_json::to_string(&OutputType::Text).unwrap(),
"\"Text\""
);
assert_eq!(
serde_json::to_string(&OutputType::Embedding).unwrap(),
"\"Embedding\""
);
assert_eq!(
serde_json::to_string(&OutputType::Audio).unwrap(),
"\"Audio\""
);
assert_eq!(
serde_json::to_string(&OutputType::Image).unwrap(),
"\"Image\""
);
assert_eq!(
serde_json::to_string(&OutputType::Json).unwrap(),
"\"Json\""
);
}
#[test]
fn test_all_audio_formats() {
assert_eq!(
serde_json::to_string(&AudioSampleFormat::Pcm16).unwrap(),
"\"Pcm16\""
);
assert_eq!(
serde_json::to_string(&AudioSampleFormat::Pcm32).unwrap(),
"\"Pcm32\""
);
assert_eq!(
serde_json::to_string(&AudioSampleFormat::Float32).unwrap(),
"\"Float32\""
);
}
#[test]
fn test_audio_input_config_default() {
let config = AudioInputConfig::default();
assert_eq!(config.sample_rate, 16000);
assert_eq!(config.channels, 1);
assert_eq!(config.format, AudioSampleFormat::Float32);
assert!(!config.streaming);
}
#[test]
fn test_audio_input_config_asr_default() {
let config = AudioInputConfig::asr_default();
assert_eq!(config.sample_rate, 16000);
assert_eq!(config.channels, 1);
assert_eq!(config.format, AudioSampleFormat::Float32);
assert!(!config.streaming);
}
#[test]
fn test_audio_input_config_asr_streaming() {
let config = AudioInputConfig::asr_streaming();
assert_eq!(config.sample_rate, 16000);
assert_eq!(config.channels, 1);
assert_eq!(config.format, AudioSampleFormat::Float32);
assert!(config.streaming); }
#[test]
fn test_audio_input_config_new() {
let config = AudioInputConfig::new(48000, 2, AudioSampleFormat::Pcm16, true);
assert_eq!(config.sample_rate, 48000);
assert_eq!(config.channels, 2);
assert_eq!(config.format, AudioSampleFormat::Pcm16);
assert!(config.streaming);
}
#[test]
fn test_audio_input_config_serialization() {
let config = AudioInputConfig::default();
let json = serde_json::to_string(&config).unwrap();
assert!(json.contains("\"sample_rate\":16000"));
assert!(json.contains("\"channels\":1"));
assert!(json.contains("\"format\":\"Float32\""));
assert!(json.contains("\"streaming\":false"));
let parsed: AudioInputConfig = serde_json::from_str(&json).unwrap();
assert_eq!(parsed.sample_rate, config.sample_rate);
assert_eq!(parsed.channels, config.channels);
assert_eq!(parsed.format, config.format);
assert_eq!(parsed.streaming, config.streaming);
}
#[test]
fn test_text_input_config_default() {
let config = TextInputConfig::default();
assert_eq!(config.max_length, None);
assert_eq!(config.encoding, "utf8");
}
#[test]
fn test_text_input_config_new() {
let config = TextInputConfig::new(Some(1000), "utf8");
assert_eq!(config.max_length, Some(1000));
assert_eq!(config.encoding, "utf8");
}
#[test]
fn test_text_input_config_llm_default() {
let config = TextInputConfig::llm_default(1024); assert_eq!(config.max_length, Some(4096)); assert_eq!(config.encoding, "utf8");
}
#[test]
fn test_text_input_config_serialization() {
let config = TextInputConfig {
max_length: Some(4096),
encoding: "utf8".to_string(),
};
let json = serde_json::to_string(&config).unwrap();
assert!(json.contains("\"max_length\":4096"));
assert!(json.contains("\"encoding\":\"utf8\""));
let parsed: TextInputConfig = serde_json::from_str(&json).unwrap();
assert_eq!(parsed.max_length, config.max_length);
assert_eq!(parsed.encoding, config.encoding);
}
#[test]
fn test_text_input_config_serialization_null_max_length() {
let config = TextInputConfig::default();
let json = serde_json::to_string(&config).unwrap();
assert!(json.contains("\"max_length\":null"));
let parsed: TextInputConfig = serde_json::from_str(&json).unwrap();
assert_eq!(parsed.max_length, None);
}
#[test]
fn test_input_config_audio() {
let config = InputConfig::Audio(AudioInputConfig::asr_default());
assert_eq!(config.input_type(), InputType::Audio);
assert!(config.as_audio().is_some());
assert!(config.as_text().is_none());
}
#[test]
fn test_input_config_text() {
let config = InputConfig::Text(TextInputConfig::default());
assert_eq!(config.input_type(), InputType::Text);
assert!(config.as_text().is_some());
assert!(config.as_audio().is_none());
}
#[test]
fn test_input_config_default() {
let config = InputConfig::default();
assert_eq!(config.input_type(), InputType::Audio);
assert!(config.as_audio().is_some());
}
#[test]
fn test_input_config_serialization_audio() {
let config = InputConfig::Audio(AudioInputConfig::default());
let json = serde_json::to_string(&config).unwrap();
assert!(json.contains("\"Audio\""));
assert!(json.contains("\"sample_rate\":16000"));
let parsed: InputConfig = serde_json::from_str(&json).unwrap();
assert_eq!(parsed.input_type(), InputType::Audio);
}
#[test]
fn test_input_config_serialization_text() {
let config = InputConfig::Text(TextInputConfig::default());
let json = serde_json::to_string(&config).unwrap();
assert!(json.contains("\"Text\""));
assert!(json.contains("\"encoding\":\"utf8\""));
let parsed: InputConfig = serde_json::from_str(&json).unwrap();
assert_eq!(parsed.input_type(), InputType::Text);
}
}