use std::ffi::{c_char, CStr};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Word<'a> {
pub conf: f32,
pub start: f32,
pub end: f32,
pub word: &'a str,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct WordInAlternative<'a> {
pub start: f32,
pub end: f32,
pub word: &'a str,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Alternative<'a> {
pub confidence: f32,
#[serde(default)]
pub result: Vec<WordInAlternative<'a>>,
pub text: &'a str,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CompleteResultMultiple<'a> {
#[serde(borrow)]
pub alternatives: Vec<Alternative<'a>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SpeakerInfo {
#[serde(rename = "spk")]
pub vector: Vec<f32>,
#[serde(rename = "spk_frames")]
pub frames: u16,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CompleteResultSingle<'a> {
#[serde(flatten)]
pub speaker_info: Option<SpeakerInfo>,
#[serde(default)]
pub result: Vec<Word<'a>>,
pub text: &'a str,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum CompleteResult<'a> {
#[serde(borrow)]
Single(CompleteResultSingle<'a>),
Multiple(CompleteResultMultiple<'a>),
}
impl<'a> CompleteResult<'a> {
#[must_use]
pub fn single(self) -> Option<CompleteResultSingle<'a>> {
match self {
Self::Single(x) => Some(x),
Self::Multiple(_) => None,
}
}
#[must_use]
pub fn multiple(self) -> Option<CompleteResultMultiple<'a>> {
match self {
Self::Single(_) => None,
Self::Multiple(x) => Some(x),
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PartialResult<'a> {
#[serde(default)]
pub partial: &'a str,
#[serde(default)]
pub partial_result: Vec<Word<'a>>,
}
pub(super) unsafe fn result_from_json_c_str<'de, T: Deserialize<'de>>(ptr: *const c_char) -> T {
let string = CStr::from_ptr(ptr).to_str().unwrap();
serde_json::from_str(string).unwrap_or_else(|_| panic!("Invalid JSON: {string:?}"))
}