#![allow(clippy::result_large_err)]
pub mod ast;
mod error;
mod parser;
pub mod semantic;
pub mod sql;
#[cfg(test)]
mod test;
mod utils;
pub use error::{downcast, ErrorMessage, ErrorMessages, SourceLocation, Span};
pub use utils::IntoOnly;
use once_cell::sync::Lazy;
use semver::Version;
pub static PRQL_VERSION: Lazy<Version> =
Lazy::new(|| Version::parse(env!("CARGO_PKG_VERSION")).expect("Invalid PRQL version number"));
pub fn compile(prql: &str, options: Option<sql::Options>) -> Result<String, ErrorMessages> {
parser::parse(prql)
.and_then(semantic::resolve)
.and_then(|rq| sql::compile(rq, options))
.map_err(error::downcast)
.map_err(|e| e.composed("", prql, false))
}
pub fn prql_to_pl(prql: &str) -> Result<Vec<ast::pl::Stmt>, ErrorMessages> {
parser::parse(prql)
.map_err(error::downcast)
.map_err(|e| e.composed("", prql, false))
}
pub fn pl_to_rq(pl: Vec<ast::pl::Stmt>) -> Result<ast::rq::Query, ErrorMessages> {
semantic::resolve(pl).map_err(error::downcast)
}
pub fn rq_to_sql(
rq: ast::rq::Query,
options: Option<sql::Options>,
) -> Result<String, ErrorMessages> {
sql::compile(rq, options).map_err(error::downcast)
}
pub fn pl_to_prql(pl: Vec<ast::pl::Stmt>) -> Result<String, ErrorMessages> {
Ok(format!("{}", ast::pl::Statements(pl)))
}
pub mod json {
use super::*;
pub fn from_pl(pl: Vec<ast::pl::Stmt>) -> Result<String, ErrorMessages> {
serde_json::to_string(&pl).map_err(|e| error::downcast(anyhow::anyhow!(e)))
}
pub fn to_pl(json: &str) -> Result<Vec<ast::pl::Stmt>, ErrorMessages> {
serde_json::from_str(json).map_err(|e| error::downcast(anyhow::anyhow!(e)))
}
pub fn from_rq(rq: ast::rq::Query) -> Result<String, ErrorMessages> {
serde_json::to_string(&rq).map_err(|e| error::downcast(anyhow::anyhow!(e)))
}
pub fn to_rq(json: &str) -> Result<ast::rq::Query, ErrorMessages> {
serde_json::from_str(json).map_err(|e| error::downcast(anyhow::anyhow!(e)))
}
}