zk-audio 0.1.0

Audio processing library for voice recording and enhancement
Documentation
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "snake_case")]
pub enum MicrophoneSimModel {
    #[default]
    Off,
    #[serde(rename = "c414_xlii")]
    C414Xlii,
    #[serde(rename = "sm7b")]
    SM7B,
    #[serde(rename = "rca44")]
    Rca44,
    #[serde(rename = "tlm103")]
    Tlm103,
    U87,
}

pub const SUPPORTED_MICROPHONE_SIM_MODELS: [MicrophoneSimModel; 6] = [
    MicrophoneSimModel::Off,
    MicrophoneSimModel::U87,
    MicrophoneSimModel::Tlm103,
    MicrophoneSimModel::C414Xlii,
    MicrophoneSimModel::SM7B,
    MicrophoneSimModel::Rca44,
];

impl MicrophoneSimModel {
    pub fn as_str(&self) -> &'static str {
        match self {
            Self::Off => "off",
            Self::C414Xlii => "c414_xlii",
            Self::SM7B => "sm7b",
            Self::Rca44 => "rca44",
            Self::Tlm103 => "tlm103",
            Self::U87 => "u87",
        }
    }

    pub fn label(&self) -> &'static str {
        match self {
            Self::Off => "Off",
            Self::C414Xlii => "AKG C414 XLII",
            Self::SM7B => "SM7B",
            Self::Rca44 => "RCA 44",
            Self::Tlm103 => "Neumann TLM 103",
            Self::U87 => "U87",
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn serde_uses_stable_model_names() {
        let model = serde_json::from_str::<MicrophoneSimModel>(r#""u87""#).unwrap();
        assert_eq!(model, MicrophoneSimModel::U87);
        assert_eq!(serde_json::to_string(&model).unwrap(), r#""u87""#);

        let model = serde_json::from_str::<MicrophoneSimModel>(r#""sm7b""#).unwrap();
        assert_eq!(model, MicrophoneSimModel::SM7B);
        assert_eq!(serde_json::to_string(&model).unwrap(), r#""sm7b""#);

        let model = serde_json::from_str::<MicrophoneSimModel>(r#""rca44""#).unwrap();
        assert_eq!(model, MicrophoneSimModel::Rca44);
        assert_eq!(serde_json::to_string(&model).unwrap(), r#""rca44""#);

        let model = serde_json::from_str::<MicrophoneSimModel>(r#""c414_xlii""#).unwrap();
        assert_eq!(model, MicrophoneSimModel::C414Xlii);
        assert_eq!(serde_json::to_string(&model).unwrap(), r#""c414_xlii""#);

        let model = serde_json::from_str::<MicrophoneSimModel>(r#""tlm103""#).unwrap();
        assert_eq!(model, MicrophoneSimModel::Tlm103);
        assert_eq!(serde_json::to_string(&model).unwrap(), r#""tlm103""#);
    }

    #[test]
    fn supported_models_include_off_u87_tlm103_c414_sm7b_and_rca44() {
        assert_eq!(
            SUPPORTED_MICROPHONE_SIM_MODELS,
            [
                MicrophoneSimModel::Off,
                MicrophoneSimModel::U87,
                MicrophoneSimModel::Tlm103,
                MicrophoneSimModel::C414Xlii,
                MicrophoneSimModel::SM7B,
                MicrophoneSimModel::Rca44,
            ]
        );
    }
}