use super::super::range::{Position, Range};
use crate::lex::escape::unescape_quoted;
use std::fmt;
#[derive(Debug, Clone, PartialEq)]
pub struct Parameter {
pub key: String,
pub value: String,
pub location: Range,
}
impl Parameter {
fn default_location() -> Range {
Range::new(0..0, Position::new(0, 0), Position::new(0, 0))
}
pub fn new(key: String, value: String) -> Self {
Self {
key,
value,
location: Self::default_location(),
}
}
pub fn at(mut self, location: Range) -> Self {
self.location = location;
self
}
pub fn unquoted_value(&self) -> String {
unescape_quoted(&self.value)
}
}
impl fmt::Display for Parameter {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}={}", self.key, self.value)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_parameter() {
let location = super::super::super::range::Range::new(
0..0,
super::super::super::range::Position::new(1, 0),
super::super::super::range::Position::new(1, 10),
);
let param = Parameter::new("key".to_string(), "value".to_string()).at(location.clone());
assert_eq!(param.location, location);
}
}