1#[cfg(feature = "exec")]
2pub mod exec;
3
4use galvan_files::Source;
5
6use pest::iterators::{Pair, Pairs};
7use pest::Parser;
8use pest_derive::*;
9
10#[derive(Parser)]
11#[grammar = "galvan.pest"]
12pub struct GalvanParser;
13
14pub struct Span(usize, usize);
15pub type BorrowedSpan<'a> = pest::Span<'a>;
16
17impl From<pest::Span<'_>> for Span {
18 fn from(value: pest::Span) -> Self {
19 Span(value.start(), value.end())
20 }
21}
22
23pub type ParserNodes<'a> = Pairs<'a, Rule>;
24pub type ParserError = Box<pest::error::Error<Rule>>;
25pub type ParseResult<'a> = Result<ParserNodes<'a>, ParserError>;
26
27pub type ParserNode<'a> = Pair<'a, Rule>;
28
29
30pub fn parse_source(source: &Source) -> ParseResult<'_> {
31 let content = source.content();
32 let pairs = GalvanParser::parse(Rule::source, content)?;
33 Ok(pairs)
34}
35