1#[cfg(feature = "exec")]
2pub mod exec;
3
4use galvan_files::Source;
5use thiserror::Error;
6
7pub use tree_sitter::*;
8
9#[derive(Debug, Error)]
10#[error("Could not parse source: {path}")]
11pub struct ParseError { path: Box<str> }
12pub type ParseTree = Tree;
13pub type ParseResult = Result<ParseTree, ParseError>;
14
15pub fn parse_source(source: &Source) -> ParseResult {
16 let mut parser = Parser::new();
17 parser
18 .set_language(&tree_sitter_galvan::language())
19 .expect("Error loading Galvan grammar!");
20
21 let content = source.content();
22 parser.parse(content, None).ok_or_else(|| {
23 let file = match source {
24 Source::File { path, content: _, canonical_name: _ } => path.to_string_lossy(),
25 Source::Str(_) => "{input string}".into(),
26 Source::Missing => "{missing}".into(),
27 Source::Builtin => "{builtin}".into(),
28
29 };
30 ParseError { path: file.into() } })
31}