tour_parser/
data.rs

1//! The [`Template`] struct.
2use syn::*;
3use crate::{ast::StmtTempl, file::File, metadata::Metadata};
4mod validate;
5
6/// Contains a single file template information.
7#[derive(Debug)]
8pub struct Template {
9    name: Ident,
10    meta: Metadata,
11    file: File,
12}
13
14impl Template {
15    /// Create new [`Template`].
16    pub fn new(name: Ident, meta: Metadata, file: File) -> Result<Self> {
17        let mut me = Self { name, meta, file };
18        validate::validate(&mut me)?;
19        Ok(me)
20    }
21
22    /// Returns selected block if any, otherwise return all statements.
23    pub(crate) fn stmts(&self) -> &[StmtTempl] {
24        match self.meta.block() {
25            Some(block) => match self.file.get_block(block) {
26                Some(block) => &block.stmts,
27                None => panic!("[BUG] validation missed, selected block missing"),
28            },
29            None => self.file.stmts(),
30        }
31    }
32
33    /// Returns all statements, regardles selected block.
34    pub fn all_stmts(&self) -> &[StmtTempl] {
35        self.file.stmts()
36    }
37
38    /// Returns template name.
39    ///
40    /// Template name is from either derive macro ident, aliased, or auto generated.
41    pub fn name(&self) -> &Ident {
42        &self.name
43    }
44
45    /// Returns template [`Metadata`].
46    pub fn meta(&self) -> &Metadata {
47        &self.meta
48    }
49
50    /// Returns template [`File`].
51    pub fn file(&self) -> &File {
52        &self.file
53    }
54
55    /// Split template into parts.
56    pub fn into_parts(self) -> (Metadata, File) {
57        (self.meta,self.file)
58    }
59}
60