use litert_lm_sys as sys;
#[derive(Debug, Clone)]
pub enum Input<'a> {
Text(&'a str),
Image(&'a [u8]),
ImageEnd,
Audio(&'a [u8]),
AudioEnd,
}
impl<'a> Input<'a> {
pub fn text(s: &'a str) -> Self {
Self::Text(s)
}
pub fn image(data: &'a [u8]) -> Self {
Self::Image(data)
}
pub fn audio(data: &'a [u8]) -> Self {
Self::Audio(data)
}
pub(crate) fn to_raw(&self) -> sys::InputData {
match self {
Input::Text(s) => sys::InputData {
type_: sys::kInputText,
data: s.as_ptr().cast(),
size: s.len(),
},
Input::Image(b) => sys::InputData {
type_: sys::kInputImage,
data: b.as_ptr().cast(),
size: b.len(),
},
Input::ImageEnd => sys::InputData {
type_: sys::kInputImageEnd,
data: std::ptr::null(),
size: 0,
},
Input::Audio(b) => sys::InputData {
type_: sys::kInputAudio,
data: b.as_ptr().cast(),
size: b.len(),
},
Input::AudioEnd => sys::InputData {
type_: sys::kInputAudioEnd,
data: std::ptr::null(),
size: 0,
},
}
}
}
pub(crate) fn inputs_to_content_json(inputs: &[Input<'_>]) -> String {
let mut parts = Vec::new();
for input in inputs {
match input {
Input::Text(s) => {
parts.push(format!(
r#"{{"type":"text","text":{}}}"#,
crate::conversation::serde_json_escape(s)
));
}
Input::Image(_) => {
parts.push(r#"{"type":"image"}"#.to_string());
}
Input::ImageEnd => {
}
Input::Audio(_) => {
parts.push(r#"{"type":"audio"}"#.to_string());
}
Input::AudioEnd => {}
}
}
format!("[{}]", parts.join(","))
}