use crate::client::OpenModex;
use crate::error::Error;
use crate::types::{Model, ModelCompareResponse, ModelListResponse};
#[derive(Debug)]
pub struct ModelService<'a> {
client: &'a OpenModex,
}
impl<'a> ModelService<'a> {
pub(crate) fn new(client: &'a OpenModex) -> Self {
Self { client }
}
pub async fn list(&self) -> Result<ModelListResponse, Error> {
self.client.get("/models").await
}
pub async fn get(&self, model_id: &str) -> Result<Model, Error> {
let path = format!("/models/{}", urlencoding_simple(model_id));
self.client.get(&path).await
}
pub async fn compare(&self, models: &[&str]) -> Result<ModelCompareResponse, Error> {
let models_param = models.join(",");
let path = format!(
"/models/compare?models={}",
urlencoding_simple(&models_param)
);
self.client.get(&path).await
}
}
fn urlencoding_simple(s: &str) -> String {
let mut result = String::with_capacity(s.len());
for b in s.bytes() {
match b {
b'A'..=b'Z'
| b'a'..=b'z'
| b'0'..=b'9'
| b'-'
| b'_'
| b'.'
| b'~' => result.push(b as char),
_ => {
result.push('%');
result.push_str(&format!("{b:02X}"));
}
}
}
result
}