use crate::error::{Result, TrustformersError};
#[cfg(feature = "hub")]
use reqwest::Client as AsyncClient;
use serde::{Deserialize, Serialize};
use std::fs;
use std::path::Path;
use trustformers_core::errors::TrustformersError as CoreTrustformersError;
#[cfg(feature = "hub")]
use super::types::HF_HUB_URL;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeltaInfo {
pub base_version: String,
pub target_version: String,
pub delta_url: String,
pub compression_ratio: f64,
pub delta_size: u64,
pub full_size: u64,
#[serde(default)]
pub delta_checksum: Option<String>,
}
pub fn reconstruct_from_delta(base_data: &[u8], delta_data: &[u8]) -> Result<Vec<u8>> {
crate::hub_delta_codec::apply_delta(base_data, delta_data).map_err(|message| {
TrustformersError::Core(CoreTrustformersError::other(format!(
"failed to apply binary delta: {message}"
)))
})
}
pub fn create_binary_delta(base_path: &Path, target_path: &Path) -> Result<Vec<u8>> {
let base_data = fs::read(base_path).map_err(|e| TrustformersError::Io {
message: format!("Failed to read base file: {}", e),
path: Some(base_path.to_string_lossy().to_string()),
suggestion: Some("Check file existence and permissions".to_string()),
})?;
let target_data = fs::read(target_path).map_err(|e| TrustformersError::Io {
message: format!("Failed to read target file: {}", e),
path: Some(target_path.to_string_lossy().to_string()),
suggestion: Some("Check file existence and permissions".to_string()),
})?;
Ok(crate::hub_delta_codec::encode_delta(
&base_data,
&target_data,
))
}
#[cfg(feature = "hub")]
pub async fn check_delta_availability(
model_id: &str,
from_revision: &str,
to_revision: &str,
) -> Result<Option<DeltaInfo>> {
let delta_url = format!(
"{}/api/models/{}/deltas/{}/{}",
HF_HUB_URL, model_id, from_revision, to_revision
);
let client = AsyncClient::new();
let response = client.get(&delta_url).send().await;
match response {
Ok(resp) if resp.status().is_success() => {
let delta_info: DeltaInfo = resp.json().await.map_err(|e| {
TrustformersError::invalid_input(
format!("Failed to parse delta info: {}", e),
Some("delta_response"),
Some("valid DeltaInfo JSON object"),
Some("invalid JSON format"),
)
})?;
Ok(Some(delta_info))
},
_ => Ok(None), }
}