1use std::str::FromStr;
2
3use thiserror::Error;
4
5#[derive(Error, Debug, PartialEq, Eq)]
7pub enum MetadataKeyValuePairError {
8 #[error("error on parsing key=value pair")]
10 ParseError,
11 #[error("metadata key must start with 'x-' prefix")]
13 InvalidPrefix,
14}
15
16#[derive(Clone, Debug)]
18pub struct MetadataKeyValuePair {
19 pub key: String,
21 pub value: String,
23}
24
25impl FromStr for MetadataKeyValuePair {
26 type Err = MetadataKeyValuePairError;
27
28 fn from_str(s: &str) -> Result<Self, Self::Err> {
29 let parts = s.split('=').collect::<Vec<&str>>();
30 if parts.len() != 2 {
31 return Err(MetadataKeyValuePairError::ParseError);
32 }
33
34 if !parts[0].starts_with("x-") {
35 return Err(MetadataKeyValuePairError::InvalidPrefix);
36 }
37
38 Ok(Self {
39 key: parts[0].to_string(),
40 value: parts[1].to_string(),
41 })
42 }
43}
44
45#[cfg(test)]
46mod tests {
47 use super::*;
48
49 #[test]
50 fn test_parse_success() {
51 let metadata = MetadataKeyValuePair::from_str("x-fuu=bar").unwrap();
52 assert_eq!(metadata.key, "x-fuu");
53 assert_eq!(metadata.value, "bar");
54 }
55
56 #[test]
57 fn test_parse_notpair_failure() {
58 let metadata = MetadataKeyValuePair::from_str("x-fuubar");
59 assert_eq!(
60 metadata.err().unwrap(),
61 MetadataKeyValuePairError::ParseError
62 );
63 }
64
65 #[test]
66 fn test_parse_prefix_failure() {
67 let metadata = MetadataKeyValuePair::from_str("fuu=bar");
68 assert_eq!(
69 metadata.err().unwrap(),
70 MetadataKeyValuePairError::InvalidPrefix
71 );
72 }
73}