aldrin_parser/ast/
doc_string.rs

1use crate::grammar::Rule;
2use crate::Span;
3use pest::iterators::Pair;
4
5#[derive(Debug, Clone)]
6pub struct DocString {
7    span: Span,
8    value: String,
9}
10
11impl DocString {
12    pub(crate) fn parse(pair: Pair<Rule>) -> Self {
13        assert_eq!(pair.as_rule(), Rule::doc_string);
14        Self::parse_impl(pair)
15    }
16
17    pub(crate) fn parse_inline(pair: Pair<Rule>) -> Self {
18        assert_eq!(pair.as_rule(), Rule::doc_string_inline);
19        Self::parse_impl(pair)
20    }
21
22    fn parse_impl(pair: Pair<Rule>) -> Self {
23        Self {
24            span: Span::from_pair(&pair),
25            value: pair.as_str().to_owned(),
26        }
27    }
28
29    pub fn span(&self) -> Span {
30        self.span
31    }
32
33    pub fn span_inner(&self) -> Span {
34        let value = &self.value[3..];
35
36        Span {
37            start: self.span.start + 3 + value.starts_with(' ') as usize,
38            end: self.span.end - value.len() + value.trim_end().len(),
39        }
40    }
41
42    pub fn value(&self) -> &str {
43        &self.value
44    }
45
46    pub fn value_inner(&self) -> &str {
47        let value = &self.value[3..];
48        value.strip_prefix(' ').unwrap_or(value).trim_end()
49    }
50}