asciidork_parser/
parse_result.rs1use 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}