use crate::call;
use crate::config::SetConfig;
use crate::ctypes::{PD_Config, PD_ConfigSetModel, PD_ConfigSetModelBuffer, PD_ConfigSetModelDir};
use crate::utils::to_c_str;
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(untagged))]
#[derive(Debug, Clone)]
pub enum Model {
Dir(String),
Path {
model_file_path: String,
params_file_path: String,
},
Memory {
model: Vec<u8>,
params: Vec<u8>,
},
}
impl Model {
pub fn dir<S: ToString>(model_dir_path: S) -> Self {
Self::Dir(model_dir_path.to_string())
}
pub fn path<S: ToString>(model_file_path: S, params_file_path: S) -> Self {
Self::Path {
model_file_path: model_file_path.to_string(),
params_file_path: params_file_path.to_string(),
}
}
}
impl SetConfig for Model {
fn set_to(self, config: *mut PD_Config) {
match self {
Model::Dir(dir) => {
let (_p, ptr) = to_c_str(&dir);
call! { PD_ConfigSetModelDir(config, ptr) };
}
Model::Path {
model_file_path,
params_file_path,
} => {
let (_m, model_path) = to_c_str(&model_file_path);
let (_p, params_path) = to_c_str(¶ms_file_path);
call! { PD_ConfigSetModel(config, model_path, params_path) };
}
Model::Memory { model, params } => {
call! {
PD_ConfigSetModelBuffer(
config,
model.as_ptr() as *const _,
model.len(),
params.as_ptr() as *const _,
params.len()
)
};
}
}
}
}