use std::ffi::CString;
use std::path::Path;
use transcribe_cpp_sys as sys;
use crate::error::{check, Result};
use crate::result::owned_str;
use crate::types::Backend;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Device {
pub name: String,
pub description: String,
pub kind: String,
}
pub fn init_backends(dir: impl AsRef<Path>) -> Result<()> {
let dir = dir.as_ref();
let c_dir = CString::new(crate::model::path_bytes(dir)?)?;
let status = unsafe { sys::transcribe_init_backends(c_dir.as_ptr()) };
check(status, "init_backends")
}
pub fn init_backends_default() -> Result<()> {
let status = unsafe { sys::transcribe_init_backends_default() };
check(status, "init_backends_default")
}
pub fn device_count() -> usize {
let n = unsafe { sys::transcribe_backend_device_count() };
n.max(0) as usize
}
pub fn devices() -> Vec<Device> {
let mut out = Vec::with_capacity(device_count());
for i in 0..device_count() as i32 {
let mut raw: sys::transcribe_backend_device = unsafe { std::mem::zeroed() };
unsafe { sys::transcribe_backend_device_init(&mut raw) };
let status = unsafe { sys::transcribe_get_backend_device(i, &mut raw) };
if status == sys::transcribe_status::TRANSCRIBE_OK {
out.push(Device {
name: owned_str(raw.name),
description: owned_str(raw.description),
kind: owned_str(raw.kind),
});
}
}
out
}
pub fn backend_available(backend: Backend) -> bool {
unsafe { sys::transcribe_backend_available(backend.to_raw()) }
}