From 4e32e0a4c7d8c9e97c552d632fc04696972fdee3 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Tue, 23 May 2023 23:08:16 +0200 Subject: [PATCH] fix(conf): fix the ambigity when we get a list of confs Signed-off-by: Vincenzo Palazzo --- conf/src/lib.rs | 44 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/conf/src/lib.rs b/conf/src/lib.rs index 105019f..55d0012 100644 --- a/conf/src/lib.rs +++ b/conf/src/lib.rs @@ -8,6 +8,7 @@ mod parser; use file::{File, SyncFile}; +#[derive(Debug)] pub struct ParsingError { pub core: u64, pub cause: String, @@ -22,6 +23,12 @@ impl From for ParsingError { } } +impl std::fmt::Display for ParsingError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.cause) + } +} + pub trait SyncCLNConf { fn parse(&mut self) -> Result<(), ParsingError>; } @@ -78,17 +85,48 @@ impl CLNConf { Ok(()) } - pub fn get_conf(&self, key: &str) -> Option> { + /// Get a unique field with the specified key, if there are multiple definition + /// the function return an error. + /// + /// In the case of multiple definition of the same key you would like to use `get_confs`. + pub fn get_conf(&self, key: &str) -> Result, ParsingError> { + let mut results = vec![]; + if let Some(fields) = self.fields.get(key) { + results.append(&mut fields.clone()); + } + for include in &self.includes { + let fields = include.get_confs(key); + if !fields.is_empty() { + results.append(&mut fields.clone()); + } + } + if results.is_empty() { + return Ok(None); + } + + if results.len() > 1 { + return Err(ParsingError { + core: 1, + cause: "mutiple field with the `{key}`".to_owned(), + }); + } + Ok(Some(results.first().unwrap().clone())) + } + + /// Return a list of values with the specified key, if no + /// item is found, return an empity vector. + pub fn get_confs(&self, key: &str) -> Vec { let mut results = vec![]; if let Some(fields) = self.fields.get(key) { results.append(&mut fields.clone()); } for include in &self.includes { - if let Some(fields) = include.get_conf(key) { + let fields = include.get_confs(key); + if !fields.is_empty() { results.append(&mut fields.clone()); } } - Some(results) + results } pub fn add_subconf(&mut self, conf: CLNConf) -> Result<(), ParsingError> {