lex_core/lex/ast/elements/
parameter.rs

1//! Parameter element
2//!
3//!     A parameter is a pair of key and value. Parameters are components that carry a bit
4//!     of information inside an element, only used in metadata. They can be used in
5//!     annotations and verbatim blocks to convey structured metadata.
6//!
7//!     Together with labels, parameters allow for structured metadata. They are used in
8//!     data nodes, which have the syntax:
9//!         :: label params?
10//!
11//! Syntax
12//!
13//!     <key> "=" <value>
14//!
15//!     Examples:
16//!         priority=high
17//!         severity=high
18//!
19//!     Parameters are optional in data nodes. Multiple parameters can be specified
20//!     separated by whitespace.
21//!
22//!     See [Data](super::data::Data) for how parameters are used in data nodes.
23//!
24//!     Learn More:
25//!         - Parameters spec: specs/v1/elements/parameter.lex
26
27use super::super::range::{Position, Range};
28use std::fmt;
29
30/// A parameter represents a key-value pair
31#[derive(Debug, Clone, PartialEq)]
32pub struct Parameter {
33    pub key: String,
34    pub value: String,
35    pub location: Range,
36}
37
38impl Parameter {
39    fn default_location() -> Range {
40        Range::new(0..0, Position::new(0, 0), Position::new(0, 0))
41    }
42
43    pub fn new(key: String, value: String) -> Self {
44        Self {
45            key,
46            value,
47            location: Self::default_location(),
48        }
49    }
50
51    /// Preferred builder
52    pub fn at(mut self, location: Range) -> Self {
53        self.location = location;
54        self
55    }
56}
57
58impl fmt::Display for Parameter {
59    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
60        write!(f, "{}={}", self.key, self.value)
61    }
62}
63
64#[cfg(test)]
65mod tests {
66    use super::*;
67
68    #[test]
69    fn test_parameter() {
70        let location = super::super::super::range::Range::new(
71            0..0,
72            super::super::super::range::Position::new(1, 0),
73            super::super::super::range::Position::new(1, 10),
74        );
75        let param = Parameter::new("key".to_string(), "value".to_string()).at(location.clone());
76        assert_eq!(param.location, location);
77    }
78}