iceberg/io/storage/config/
hf.rs1use serde::{Deserialize, Serialize};
21use typed_builder::TypedBuilder;
22
23use super::StorageConfig;
24use crate::Result;
25
26pub const HF_TOKEN: &str = "hf.token";
28pub const HF_ENDPOINT: &str = "hf.endpoint";
30pub const HF_REVISION: &str = "hf.revision";
32
33#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize, TypedBuilder)]
40pub struct HfConfig {
41 #[builder(default, setter(strip_option, into))]
43 pub token: Option<String>,
44 #[builder(default, setter(strip_option, into))]
46 pub endpoint: Option<String>,
47 #[builder(default, setter(strip_option, into))]
49 pub revision: Option<String>,
50}
51
52impl TryFrom<&StorageConfig> for HfConfig {
53 type Error = crate::Error;
54
55 fn try_from(config: &StorageConfig) -> Result<Self> {
56 let props = config.props();
57 let mut cfg = HfConfig::default();
58 if let Some(token) = props.get(HF_TOKEN) {
59 cfg.token = Some(token.clone());
60 }
61 if let Some(endpoint) = props.get(HF_ENDPOINT) {
62 cfg.endpoint = Some(endpoint.clone());
63 }
64 if let Some(revision) = props.get(HF_REVISION) {
65 cfg.revision = Some(revision.clone());
66 }
67 Ok(cfg)
68 }
69}
70
71#[cfg(test)]
72mod tests {
73 use super::*;
74
75 #[test]
76 fn test_hf_config_builder() {
77 let cfg = HfConfig::builder()
78 .token("hf_mytoken")
79 .endpoint("https://huggingface.co")
80 .revision("dev")
81 .build();
82 assert_eq!(cfg.token.as_deref(), Some("hf_mytoken"));
83 assert_eq!(cfg.endpoint.as_deref(), Some("https://huggingface.co"));
84 assert_eq!(cfg.revision.as_deref(), Some("dev"));
85 }
86
87 #[test]
88 fn test_hf_config_from_storage_config() {
89 let storage_config = StorageConfig::new()
90 .with_prop(HF_TOKEN, "hf_abc123")
91 .with_prop(HF_ENDPOINT, "https://huggingface.co");
92
93 let cfg = HfConfig::try_from(&storage_config).unwrap();
94 assert_eq!(cfg.token.as_deref(), Some("hf_abc123"));
95 assert_eq!(cfg.endpoint.as_deref(), Some("https://huggingface.co"));
96 }
97
98 #[test]
99 fn test_hf_config_empty() {
100 let cfg = HfConfig::try_from(&StorageConfig::new()).unwrap();
101 assert_eq!(cfg.token, None);
102 assert_eq!(cfg.endpoint, None);
103 }
104}