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 39 40 41
use serde::Deserialize; use std::cmp::Ord; use std::fmt::Display; use std::str::FromStr; #[derive(Deserialize, Debug, Eq, PartialEq, PartialOrd, Ord)] pub struct KeyValue { pub name: String, pub value: String, } impl KeyValue { pub fn new(name: &str, value: &str) -> KeyValue { KeyValue { name: name.to_owned(), value: value.to_owned(), } } } #[derive(Debug)] pub struct KeyValueParsingError; impl Display for KeyValueParsingError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "Bindings must be specified in the format 'key=value'") } } impl FromStr for KeyValue { type Err = KeyValueParsingError; fn from_str(s: &str) -> Result<Self, Self::Err> { let split: Vec<&str> = s.split('=').collect(); match split[..] { [l, r] if !l.trim().is_empty() => Ok(KeyValue::new(l, r)), _ => Err(KeyValueParsingError), } } }