pub mod request {
use url::Url;
use crate::{
errors::OapiError,
rest::delete::{Delete, DeleteNoStream},
};
#[derive(Debug, Clone)]
pub struct DeleteModelRequest<'a> {
pub model: &'a str,
}
impl Delete for DeleteModelRequest<'_> {
fn build_url(&self, base_url: &str) -> Result<String, OapiError> {
let mut url =
Url::parse(base_url.trim_end_matches('/')).map_err(OapiError::UrlError)?;
url.path_segments_mut()
.map_err(|_| OapiError::UrlCannotBeBase(base_url.to_string()))?
.push("models")
.push(self.model);
Ok(url.to_string())
}
}
impl DeleteNoStream for DeleteModelRequest<'_> {
type Response = super::response::ModelDeleted;
}
}
pub mod response {
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct ModelDeleted {
pub id: String,
pub deleted: bool,
pub object: String,
}
crate::impl_from_str!(ModelDeleted);
}
#[cfg(test)]
mod tests {
use super::request::DeleteModelRequest;
use crate::rest::delete::Delete;
#[test]
fn test_build_url() {
let request = DeleteModelRequest {
model: "ft:gpt-4o:my-org:custom-suffix:7p8f9k",
};
let url = request.build_url("https://api.openai.com/v1").unwrap();
assert_eq!(
url,
"https://api.openai.com/v1/models/ft:gpt-4o:my-org:custom-suffix:7p8f9k"
);
}
#[test]
fn test_parse_delete_response() {
let content =
r#"{"id":"ft:gpt-4o:my-org:custom-suffix:7p8f9k","deleted":true,"object":"model"}"#;
let response: super::response::ModelDeleted = content.parse().unwrap();
assert_eq!(response.id, "ft:gpt-4o:my-org:custom-suffix:7p8f9k");
assert!(response.deleted);
assert_eq!(response.object, "model");
}
}