opendal/services/sqlite/
config.rs1use std::fmt::Debug;
19use std::fmt::Formatter;
20
21use super::backend::SqliteBuilder;
22use serde::Deserialize;
23use serde::Serialize;
24
25#[derive(Default, Serialize, Deserialize, Clone, PartialEq, Eq)]
27#[serde(default)]
28#[non_exhaustive]
29pub struct SqliteConfig {
30 pub connection_string: Option<String>,
42
43 pub table: Option<String>,
45 pub key_field: Option<String>,
49 pub value_field: Option<String>,
53 pub root: Option<String>,
57}
58
59impl Debug for SqliteConfig {
60 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
61 let mut d = f.debug_struct("SqliteConfig");
62
63 d.field("connection_string", &self.connection_string)
64 .field("table", &self.table)
65 .field("key_field", &self.key_field)
66 .field("value_field", &self.value_field)
67 .field("root", &self.root);
68
69 d.finish_non_exhaustive()
70 }
71}
72
73impl crate::Configurator for SqliteConfig {
74 type Builder = SqliteBuilder;
75 fn from_uri(uri: &crate::types::OperatorUri) -> crate::Result<Self> {
76 let mut map = uri.options().clone();
77
78 if let Some(authority) = uri.authority() {
79 map.entry("connection_string".to_string())
80 .or_insert_with(|| format!("sqlite://{authority}"));
81 }
82
83 if let Some(path) = uri.root() {
84 if !path.is_empty() {
85 let (table, rest) = match path.split_once('/') {
86 Some((table, remainder)) => (table, Some(remainder)),
87 None => (path, None),
88 };
89
90 if !table.is_empty() {
91 map.entry("table".to_string())
92 .or_insert_with(|| table.to_string());
93 }
94
95 if let Some(root) = rest {
96 if !root.is_empty() {
97 map.insert("root".to_string(), root.to_string());
98 }
99 }
100 }
101 }
102
103 Self::from_iter(map)
104 }
105
106 fn into_builder(self) -> Self::Builder {
107 SqliteBuilder { config: self }
108 }
109}
110
111#[cfg(test)]
112mod tests {
113 use super::*;
114 use crate::Configurator;
115 use crate::types::OperatorUri;
116
117 #[test]
118 fn from_uri_sets_connection_string_table_and_root() {
119 let uri =
120 OperatorUri::new("sqlite://data.db/kv/cache", Vec::<(String, String)>::new()).unwrap();
121
122 let cfg = SqliteConfig::from_uri(&uri).unwrap();
123 assert_eq!(cfg.connection_string.as_deref(), Some("sqlite://data.db"));
124 assert_eq!(cfg.table.as_deref(), Some("kv"));
125 assert_eq!(cfg.root.as_deref(), Some("cache"));
126 }
127}