diff options
author | pommicket <pommicket@gmail.com> | 2025-09-08 13:56:30 -0400 |
---|---|---|
committer | pommicket <pommicket@gmail.com> | 2025-09-08 13:56:30 -0400 |
commit | 73e9bfa44c5b104bd322bd7011bebb367853d58c (patch) | |
tree | d82a82a63f71c20bb857626c9d711bfdcded75e2 /src/lib.rs | |
parent | 019e2518a943f22c8d7ffee541ba90326613aeb4 (diff) |
parse lists
Diffstat (limited to 'src/lib.rs')
-rw-r--r-- | src/lib.rs | 34 |
1 files changed, 30 insertions, 4 deletions
@@ -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`. /// |