summaryrefslogtreecommitdiff
path: root/src/lib.rs
diff options
context:
space:
mode:
authorpommicket <pommicket@gmail.com>2025-09-08 13:56:30 -0400
committerpommicket <pommicket@gmail.com>2025-09-08 13:56:30 -0400
commit73e9bfa44c5b104bd322bd7011bebb367853d58c (patch)
treed82a82a63f71c20bb857626c9d711bfdcded75e2 /src/lib.rs
parent019e2518a943f22c8d7ffee541ba90326613aeb4 (diff)
parse lists
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs34
1 files changed, 30 insertions, 4 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 809453c..c2d7771 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -263,8 +263,34 @@ fn parse_bool(location: &Location, string: &str) -> Result<bool> {
}
}
-fn parse_list(_location: &Location, _string: &str) -> Vec<String> {
- todo!()
+fn parse_list(string: &str) -> Vec<String> {
+ let mut list = vec![];
+ let mut item = String::new();
+ let mut chars = string.chars();
+ while let Some(c) = chars.next() {
+ if c == ',' {
+ list.push(item);
+ item = String::new();
+ } else if c == '\\' {
+ if let Some(next) = chars.next() {
+ if next == ',' || next == '\\' {
+ item.push(next);
+ } else {
+ item.push('\\');
+ item.push(next);
+ }
+ } else {
+ item.push('\\');
+ break;
+ }
+ } else {
+ item.push(c);
+ }
+ }
+ if !item.is_empty() {
+ list.push(item);
+ }
+ list
}
/// Trait for reading configurations.
@@ -759,8 +785,8 @@ impl Configuration {
/// Commas in list entries can be escaped with `\,`.
#[must_use]
pub fn get_list(&self, key: &str) -> Option<Vec<String>> {
- let Value { value, defined_at } = self.get_val(key)?;
- Some(parse_list(defined_at, value.as_ref()))
+ let value = &self.get_val(key)?.value;
+ Some(parse_list(value.as_ref()))
}
/// Get value associated with `key`, and parse it as a comma-separated list, or else use `default`.
///