tsk_rs/
metadata.rs

1use std::str::FromStr;
2
3use thiserror::Error;
4
5/// Errors that can occur during metadata handling
6#[derive(Error, Debug, PartialEq, Eq)]
7pub enum MetadataKeyValuePairError {
8    /// Malformed key=value pair was given as an input
9    #[error("error on parsing key=value pair")]
10    ParseError,
11    /// Missing constraint: metadata key names must begin with "x-" prefix
12    #[error("metadata key must start with 'x-' prefix")]
13    InvalidPrefix,
14}
15
16/// Key value pair for metadata storage
17#[derive(Clone, Debug)]
18pub struct MetadataKeyValuePair {
19    /// Key of the metadata value
20    pub key: String,
21    /// Value of the metadata
22    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}