opendal_service_cacache/
config.rs1use serde::Deserialize;
19use serde::Serialize;
20
21use super::backend::CacacheBuilder;
22
23#[derive(Default, Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
25pub struct CacacheConfig {
26 pub datadir: Option<String>,
28}
29
30impl opendal_core::Configurator for CacacheConfig {
31 type Builder = CacacheBuilder;
32 fn from_uri(uri: &opendal_core::OperatorUri) -> opendal_core::Result<Self> {
33 let mut map = uri.options().clone();
34
35 if let Some(root) = uri.root()
36 && !root.is_empty()
37 {
38 map.entry("datadir".to_string())
39 .or_insert_with(|| format!("/{root}"));
40 }
41
42 Self::from_iter(map)
43 }
44
45 fn into_builder(self) -> Self::Builder {
46 CacacheBuilder { config: self }
47 }
48}
49
50#[cfg(test)]
51mod tests {
52 use super::*;
53 use opendal_core::Configurator;
54 use opendal_core::OperatorUri;
55
56 #[test]
57 fn from_uri_sets_datadir_from_authority() {
58 let uri = OperatorUri::new(
59 "cacache:///var/cache/opendal",
60 Vec::<(String, String)>::new(),
61 )
62 .unwrap();
63
64 let cfg = CacacheConfig::from_uri(&uri).unwrap();
65 assert_eq!(cfg.datadir.as_deref(), Some("/var/cache/opendal"));
66 }
67
68 #[test]
69 fn from_uri_falls_back_to_path() {
70 let uri = OperatorUri::new("cacache:///tmp/cache", Vec::<(String, String)>::new()).unwrap();
71
72 let cfg = CacacheConfig::from_uri(&uri).unwrap();
73 assert_eq!(cfg.datadir.as_deref(), Some("/tmp/cache"));
74 }
75}