Skip to content

Commit

Permalink
fix(conf): fix the ambigity when we get a list of confs
Browse files Browse the repository at this point in the history
Signed-off-by: Vincenzo Palazzo <[email protected]>
  • Loading branch information
vincenzopalazzo committed May 23, 2023
1 parent af940d0 commit 4e32e0a
Showing 1 changed file with 41 additions and 3 deletions.
44 changes: 41 additions & 3 deletions conf/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ mod parser;

use file::{File, SyncFile};

#[derive(Debug)]
pub struct ParsingError {
pub core: u64,
pub cause: String,
Expand All @@ -22,6 +23,12 @@ impl From<io::Error> 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>;
}
Expand Down Expand Up @@ -78,17 +85,48 @@ impl CLNConf {
Ok(())
}

pub fn get_conf(&self, key: &str) -> Option<Vec<String>> {
/// 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<Option<String>, 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<String> {
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> {
Expand Down

0 comments on commit 4e32e0a

Please sign in to comment.