diff options
author | Dirkjan Ochtman <dirkjan@ochtman.nl> | 2023-07-01 16:12:54 +0200 |
---|---|---|
committer | Dirkjan Ochtman <dirkjan@ochtman.nl> | 2023-07-31 10:27:15 +0200 |
commit | 1a9f5a16fb54d6c75a8e36aafa9703cc29a0a76a (patch) | |
tree | d763bdefbcb5d53b5256762064e29b3be16af416 /askama_derive/src/parser/mod.rs | |
parent | 2912ec92f83357e6909f13674529546fa73878ac (diff) | |
download | askama-1a9f5a16fb54d6c75a8e36aafa9703cc29a0a76a.tar.gz askama-1a9f5a16fb54d6c75a8e36aafa9703cc29a0a76a.tar.bz2 askama-1a9f5a16fb54d6c75a8e36aafa9703cc29a0a76a.zip |
derive: move Parsed into parser module
Diffstat (limited to 'askama_derive/src/parser/mod.rs')
-rw-r--r-- | askama_derive/src/parser/mod.rs | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/askama_derive/src/parser/mod.rs b/askama_derive/src/parser/mod.rs index 0bf68ca..8da96f5 100644 --- a/askama_derive/src/parser/mod.rs +++ b/askama_derive/src/parser/mod.rs @@ -56,6 +56,40 @@ impl From<char> for Whitespace { } } +mod _parsed { + use std::mem; + + use super::{parse, Node, ParseError, Syntax}; + + pub(crate) struct Parsed { + #[allow(dead_code)] + source: String, + nodes: Vec<Node<'static>>, + } + + impl Parsed { + pub(crate) fn new(source: String, syntax: &Syntax<'_>) -> Result<Self, ParseError> { + // Self-referential borrowing: `self` will keep the source alive as `String`, + // internally we will transmute it to `&'static str` to satisfy the compiler. + // However, we only expose the nodes with a lifetime limited to `self`. + let src = unsafe { mem::transmute::<&str, &'static str>(source.as_str()) }; + let nodes = match parse(src, syntax) { + Ok(nodes) => nodes, + Err(e) => return Err(e), + }; + + Ok(Self { source, nodes }) + } + + // The return value's lifetime must be limited to `self` to uphold the unsafe invariant. + pub(crate) fn nodes(&self) -> &[Node<'_>] { + &self.nodes + } + } +} + +pub(crate) use _parsed::Parsed; + pub(crate) fn parse<'a>(src: &'a str, syntax: &Syntax<'_>) -> Result<Vec<Node<'a>>, ParseError> { match Node::parse(src, &State::new(syntax)) { Ok((left, res)) => { |