diff --git a/conf/CHANGELOG.md b/conf/CHANGELOG.md index b5f44f1..dd71359 100644 --- a/conf/CHANGELOG.md +++ b/conf/CHANGELOG.md @@ -1,3 +1,9 @@ +# v0.0.3 + +## Fixed +- fix the ambigity when we get a list of confs ([commit](https://github.com/laanwj/cln4rust/commit/4e32e0a4c7d8c9e97c552d632fc04696972fdee3)). @vincenzopalazzo 23-05-2023 + + # v0.0.2 ## Fixed diff --git a/conf/Cargo.toml b/conf/Cargo.toml index fd4e37c..5cf7348 100644 --- a/conf/Cargo.toml +++ b/conf/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clightningrpc-conf" -version = "0.0.2" +version = "0.0.3" edition = "2021" authors = ["Vincenzo Palazzo "] license = "CC0-1.0" diff --git a/conf/changelog.json b/conf/changelog.json index 5fe26a5..358a981 100644 --- a/conf/changelog.json +++ b/conf/changelog.json @@ -1,10 +1,10 @@ { "package_name": "conf", - "version": "v0.0.2", + "version": "v0.0.3", "api": { "name": "github", "repository": "laanwj/rust-clightning-rpc", - "branch": "master" + "branch": "macros/conf-fix" }, "generation_method": { "name": "semver-v2", 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> {