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}