1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use crate::parameter::{Parameter, ParameterValue};
use crate::{MessageError, Result};
use serde::de::DeserializeOwned;
use std::collections::HashMap;

pub trait ParametersContainer {
  fn get_parameters(&self) -> &Vec<Parameter>;

  fn get_parameter<T: DeserializeOwned>(&self, key: &str) -> Result<T>
  where
    T: ParameterValue,
  {
    for parameter in self.get_parameters() {
      if parameter.id == key && T::get_type_as_string() == parameter.kind {
        if let Some(value) = parameter.value.clone() {
          return T::parse_value(value, &parameter.store);
        } else if let Some(default) = parameter.default.clone() {
          return T::parse_value(default, &parameter.store);
        }
      }
    }
    Err(MessageError::ParameterValueError(format!(
      "Could not find any parameter for key '{}' and type '{}'",
      key,
      T::get_type_as_string()
    )))
  }

  fn get_parameters_as_map(&self) -> HashMap<String, String> {
    let mut map = HashMap::new();
    for param in self.get_parameters() {
      if param.has_value_or_default() {
        map.insert(param.get_id(), param.to_string());
      }
    }
    map
  }
}