pub mod download;
pub mod model_card;
pub mod progress;
pub mod registry;
pub mod upload;
pub use download::{
ChecksumVerifier, DownloadConfig, DownloadError, DownloadProgress, ModelDownloader,
};
pub use model_card::{
DatasetInfo, Framework, License, MetricResult, ModelCard, ModelCardBuilder, TaskType,
};
pub use progress::{
MultiProgress, ProgressBar, ProgressCallback, ProgressIndicator, ProgressStyle,
};
pub use registry::{
get_model_info, HardwareRequirements, ModelInfo, ModelSize, QuantizationLevel, RuvLtraRegistry,
};
pub use upload::{ModelMetadata, ModelUploader, UploadConfig, UploadError, UploadProgress};
use std::path::PathBuf;
pub type Result<T> = std::result::Result<T, HubError>;
#[derive(Debug, thiserror::Error)]
pub enum HubError {
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
#[cfg(feature = "async-runtime")]
#[error("HTTP error: {0}")]
Http(String),
#[error("Authentication failed: {0}")]
Auth(String),
#[error("Model not found: {0}")]
NotFound(String),
#[error("Checksum verification failed: expected {expected}, got {actual}")]
ChecksumMismatch { expected: String, actual: String },
#[error("Invalid model format: {0}")]
InvalidFormat(String),
#[error("Rate limit exceeded. Retry after {0} seconds")]
RateLimit(u64),
#[error("Network error: {0}")]
Network(String),
#[error("Parse error: {0}")]
Parse(String),
#[error("Configuration error: {0}")]
Config(String),
}
pub const HF_ENDPOINT: &str = "https://huggingface.co";
pub fn default_cache_dir() -> PathBuf {
dirs::cache_dir()
.unwrap_or_else(|| PathBuf::from("."))
.join("huggingface")
.join("ruvltra")
}
pub fn get_hf_token() -> Option<String> {
std::env::var("HF_TOKEN")
.or_else(|_| std::env::var("HUGGING_FACE_HUB_TOKEN"))
.or_else(|_| std::env::var("HUGGINGFACE_API_KEY"))
.ok()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_cache_dir() {
let cache_dir = default_cache_dir();
assert!(cache_dir.to_string_lossy().contains("huggingface"));
assert!(cache_dir.to_string_lossy().contains("ruvltra"));
}
#[test]
fn test_error_display() {
let err = HubError::NotFound("model-123".to_string());
assert_eq!(err.to_string(), "Model not found: model-123");
let err = HubError::ChecksumMismatch {
expected: "abc123".to_string(),
actual: "def456".to_string(),
};
assert!(err.to_string().contains("abc123"));
assert!(err.to_string().contains("def456"));
}
}