aldrin_parser/ast/
doc_string.rs1use 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}