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