use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
#[serde(default, deny_unknown_fields)]
#[non_exhaustive]
pub struct HfConfig {
pub token: Option<String>,
pub base_url: Option<String>,
pub default_revision: Option<String>,
}
impl HfConfig {
pub fn new(
token: Option<String>,
base_url: Option<String>,
default_revision: Option<String>,
) -> Self {
Self {
token,
base_url,
default_revision,
}
}
pub fn token(&self) -> Option<String> {
if let Some(t) = &self.token
&& !t.is_empty()
{
return Some(t.clone());
}
for var in [
crate::env::VOXORA_HF_TOKEN,
"HF_TOKEN",
"HUGGING_FACE_HUB_TOKEN",
] {
if let Ok(t) = std::env::var(var)
&& !t.is_empty()
{
return Some(t);
}
}
None
}
pub fn base_url(&self) -> String {
if let Some(u) = &self.base_url
&& !u.is_empty()
{
return u.clone();
}
if let Ok(u) = std::env::var(crate::env::VOXORA_HF_BASE_URL)
&& !u.is_empty()
{
return u;
}
"https://huggingface.co".to_string()
}
pub fn default_revision(&self) -> String {
self.default_revision
.clone()
.filter(|s| !s.is_empty())
.or_else(|| {
std::env::var(crate::env::VOXORA_HF_REVISION)
.ok()
.filter(|s| !s.is_empty())
})
.unwrap_or_else(|| "main".to_string())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_base_url_is_huggingface_co() {
assert_eq!(HfConfig::default().base_url(), "https://huggingface.co");
}
#[test]
fn default_revision_is_main() {
assert_eq!(HfConfig::default().default_revision(), "main");
}
#[test]
fn explicit_base_url_wins() {
let cfg = HfConfig {
base_url: Some("http://localhost:8080".into()),
..Default::default()
};
assert_eq!(cfg.base_url(), "http://localhost:8080");
}
#[test]
fn explicit_token_wins_over_env() {
let cfg = HfConfig {
token: Some("explicit-token".into()),
..Default::default()
};
assert_eq!(cfg.token().as_deref(), Some("explicit-token"));
}
#[test]
fn explicit_default_revision_wins() {
let cfg = HfConfig {
default_revision: Some("v0.0.1".into()),
..Default::default()
};
assert_eq!(cfg.default_revision(), "v0.0.1");
}
#[test]
fn new_matches_struct_expression() {
let cfg = HfConfig::new(Some("t".into()), Some("u".into()), Some("r".into()));
assert_eq!(
cfg,
HfConfig {
token: Some("t".into()),
base_url: Some("u".into()),
default_revision: Some("r".into()),
}
);
}
}