asciidork_parser/
parse_result.rs

1use std::fmt::{Debug, Formatter};
2
3use crate::internal::*;
4
5pub struct ParseResult<'arena> {
6  pub document: Document<'arena>,
7  pub warnings: Vec<Diagnostic>,
8  pub(crate) attr_defs: BumpVec<'arena, AttrDef>,
9  pub include_resolver: Option<Box<dyn IncludeResolver>>,
10  #[cfg(feature = "attr_ref_observation")]
11  pub attr_ref_observer: Option<Box<dyn AttrRefObserver>>,
12  lexer: Lexer<'arena>,
13}
14
15impl ParseResult<'_> {
16  pub fn line_number_with_offset(&self, loc: SourceLocation) -> (u32, u32) {
17    self.lexer.line_number_with_offset(loc)
18  }
19
20  pub fn source_file_at(&self, idx: u16) -> &SourceFile {
21    self.lexer.source_file_at(idx)
22  }
23
24  pub fn take_include_resolver_as<T: 'static>(&mut self) -> Option<T> {
25    let resolver = self.include_resolver.take()?;
26    let any_resolver = resolver as Box<dyn std::any::Any>;
27    Some(*any_resolver.downcast::<T>().unwrap())
28  }
29
30  #[cfg(feature = "attr_ref_observation")]
31  pub fn take_attr_ref_observer_as<T: 'static>(&mut self) -> Option<T> {
32    let observer = self.attr_ref_observer.take()?;
33    let any_observer = observer as Box<dyn std::any::Any>;
34    Some(*any_observer.downcast::<T>().unwrap())
35  }
36}
37
38impl<'arena> From<Parser<'arena>> for ParseResult<'arena> {
39  fn from(parser: Parser<'arena>) -> Self {
40    ParseResult {
41      document: parser.document,
42      warnings: parser.errors.into_inner(),
43      attr_defs: parser.ctx.attr_defs,
44      include_resolver: parser.include_resolver,
45      #[cfg(feature = "attr_ref_observation")]
46      attr_ref_observer: parser.attr_ref_observer,
47      lexer: parser.lexer,
48    }
49  }
50}
51
52impl Debug for ParseResult<'_> {
53  fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
54    f.debug_struct("ParseResult")
55      .field("document", &self.document)
56      .field("warnings", &self.warnings)
57      .finish()
58  }
59}