opendal/services/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 crate::Configurator for CacacheConfig {
31 type Builder = CacacheBuilder;
32 fn from_uri(uri: &crate::types::OperatorUri) -> crate::Result<Self> {
33 let mut map = uri.options().clone();
34
35 if let Some(root) = uri.root() {
36 if !root.is_empty() {
37 map.entry("datadir".to_string())
38 .or_insert_with(|| format!("/{root}"));
39 }
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 crate::Configurator;
54 use crate::types::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}