diff --git a/src/ast.rs b/src/ast.rs index b29755a6..96899b0e 100644 --- a/src/ast.rs +++ b/src/ast.rs @@ -1,4 +1,4 @@ -use pest::iterators::{Pair, Pairs}; +use pest::iterators::{Pair}; use pest::Parser as PestParser; use pest::prec_climber::{Assoc, PrecClimber, Operator}; use crate::parser::Parser; @@ -6,7 +6,7 @@ use crate::parser::Rule; use lazy_static::lazy_static; use crate::ast::Expr::{Apply, Const}; use crate::error::CozoError; -use crate::error::CozoError::ReservedIdent; +use crate::error::Result; use crate::value::Value; @@ -66,7 +66,7 @@ pub trait ExprVisitor<'a, T> { } -fn build_expr_infix<'a>(lhs: Result, CozoError>, op: Pair, rhs: Result, CozoError>) -> Result, CozoError> { +fn build_expr_infix<'a>(lhs: Result>, op: Pair, rhs: Result>) -> Result> { let lhs = lhs?; let rhs = rhs?; let op = match op.as_rule() { @@ -96,12 +96,12 @@ fn parse_int(s: &str, radix: u32) -> i64 { } #[inline] -fn parse_raw_string(pair: Pair) -> Result { +fn parse_raw_string(pair: Pair) -> Result { Ok(pair.into_inner().into_iter().next().unwrap().as_str().to_string()) } #[inline] -fn parse_quoted_string(pair: Pair) -> Result { +fn parse_quoted_string(pair: Pair) -> Result { let pairs = pair.into_inner().next().unwrap().into_inner(); let mut ret = String::with_capacity(pairs.as_str().len()); for pair in pairs { @@ -129,7 +129,7 @@ fn parse_quoted_string(pair: Pair) -> Result { #[inline] -fn parse_s_quoted_string(pair: Pair) -> Result { +fn parse_s_quoted_string(pair: Pair) -> Result { let pairs = pair.into_inner().next().unwrap().into_inner(); let mut ret = String::with_capacity(pairs.as_str().len()); for pair in pairs { @@ -156,7 +156,7 @@ fn parse_s_quoted_string(pair: Pair) -> Result { } #[inline] -pub fn parse_string(pair: Pair) -> Result { +pub fn parse_string(pair: Pair) -> Result { match pair.as_rule() { Rule::quoted_string => Ok(parse_quoted_string(pair)?), Rule::s_quoted_string => Ok(parse_s_quoted_string(pair)?), @@ -165,7 +165,7 @@ pub fn parse_string(pair: Pair) -> Result { } } -fn build_expr_primary(pair: Pair) -> Result { +fn build_expr_primary(pair: Pair) -> Result { match pair.as_rule() { Rule::expr => build_expr_primary(pair.into_inner().next().unwrap()), Rule::term => build_expr_primary(pair.into_inner().next().unwrap()), @@ -189,7 +189,7 @@ fn build_expr_primary(pair: Pair) -> Result { Rule::dot_float | Rule::sci_float => Ok(Const(Value::Float(pair.as_str().replace('_', "").parse::()?))), Rule::null => Ok(Const(Value::Null)), Rule::boolean => Ok(Const(Value::Bool(pair.as_str() == "true"))), - Rule::quoted_string | Rule::s_quoted_string | Rule::s_quoted_string => Ok( + Rule::quoted_string | Rule::s_quoted_string | Rule::raw_string => Ok( Const(Value::OwnString(Box::new(parse_string(pair)?)))), _ => { println!("{:#?}", pair); @@ -198,11 +198,11 @@ fn build_expr_primary(pair: Pair) -> Result { } } -fn build_expr(pair: Pair) -> Result { +fn build_expr(pair: Pair) -> Result { PREC_CLIMBER.climb(pair.into_inner(), build_expr_primary, build_expr_infix) } -pub fn parse_expr_from_str(inp: &str) -> Result { +pub fn parse_expr_from_str(inp: &str) -> Result { let expr_tree = Parser::parse(Rule::expr, inp)?.next().unwrap(); build_expr(expr_tree) } diff --git a/src/definition.rs b/src/definition.rs index d140526f..424467b6 100644 --- a/src/definition.rs +++ b/src/definition.rs @@ -1,11 +1,10 @@ -use pest::Parser as PestParser; use pest::iterators::{Pair, Pairs}; use crate::ast::parse_string; use crate::env::Env; -use crate::error::CozoError; +use crate::error::Result; use crate::error::CozoError::*; -use crate::parser::{Parser, Rule}; -use crate::typing::{BaseType, Col, Edge, Node, Structured, StructuredEnv, StructuredEnvItem, TableId, Typing}; +use crate::parser::{Rule}; +use crate::typing::{Col, Edge, Node, Structured, StructuredEnv, StructuredEnvItem, TableId, Typing}; use crate::typing::Persistence::{Global, Local}; use crate::typing::StorageStatus::Planned; use crate::value::Value; @@ -14,7 +13,7 @@ fn parse_ident(pair: Pair) -> String { pair.as_str().to_string() } -fn build_name_in_def(pair: Pair, forbid_underscore: bool) -> Result { +fn build_name_in_def(pair: Pair, forbid_underscore: bool) -> Result { let inner = pair.into_inner().next().unwrap(); let name = match inner.as_rule() { Rule::ident => parse_ident(inner), @@ -28,7 +27,7 @@ fn build_name_in_def(pair: Pair, forbid_underscore: bool) -> Result) -> Result<(String, bool), CozoError> { +fn parse_col_name(pair: Pair) -> Result<(String, bool)> { let mut pairs = pair.into_inner(); let mut is_key = false; let mut nxt_pair = pairs.next().unwrap(); @@ -42,7 +41,7 @@ fn parse_col_name(pair: Pair) -> Result<(String, bool), CozoError> { impl StructuredEnvItem { - pub fn build_edge_def(&mut self, pair: Pair, table_id: TableId) -> Result<(), CozoError> { + pub fn build_edge_def(&mut self, pair: Pair, table_id: TableId) -> Result<()> { let mut inner = pair.into_inner(); let src_name = build_name_in_def(inner.next().unwrap(), true)?; let src = self.resolve(&src_name).ok_or(UndefinedType)?; @@ -91,7 +90,7 @@ impl StructuredEnvItem { Err(NameConflict) } } - pub fn build_node_def(&mut self, pair: Pair, table_id: TableId) -> Result<(), CozoError> { + pub fn build_node_def(&mut self, pair: Pair, table_id: TableId) -> Result<()> { let mut inner = pair.into_inner(); let name = build_name_in_def(inner.next().unwrap(), true)?; let (keys, cols) = self.build_col_defs(inner.next().unwrap())?; @@ -110,7 +109,7 @@ impl StructuredEnvItem { } } - fn build_type(&self, pair: Pair) -> Result { + fn build_type(&self, pair: Pair) -> Result { let mut pairs = pair.into_inner(); let mut inner = pairs.next().unwrap(); let nullable = if Rule::nullable_marker == inner.as_rule() { @@ -142,12 +141,12 @@ impl StructuredEnvItem { }) } - fn build_default_value(&self, _pair: Pair) -> Result, CozoError> { + fn build_default_value(&self, _pair: Pair) -> Result> { // TODO: _pair is an expression, parse it and evaluate it to a constant value Ok(Value::Null) } - fn build_col_entry(&self, pair: Pair) -> Result<(Col, bool), CozoError> { + fn build_col_entry(&self, pair: Pair) -> Result<(Col, bool)> { let mut pairs = pair.into_inner(); let (name, is_key) = parse_col_name(pairs.next().unwrap())?; let typ = self.build_type(pairs.next().unwrap())?; @@ -164,7 +163,7 @@ impl StructuredEnvItem { }, is_key)) } - fn build_col_defs(&self, pair: Pair) -> Result<(Vec, Vec), CozoError> { + fn build_col_defs(&self, pair: Pair) -> Result<(Vec, Vec)> { let mut keys = vec![]; let mut cols = vec![]; for pair in pair.into_inner() { @@ -181,7 +180,7 @@ impl StructuredEnvItem { } impl StructuredEnv { - pub fn build_table(&mut self, pairs: Pairs) -> Result<(), CozoError> { + pub fn build_table(&mut self, pairs: Pairs) -> Result<()> { for pair in pairs { match pair.as_rule() { r @ (Rule::global_def | Rule::local_def) => { @@ -217,6 +216,8 @@ impl StructuredEnv { #[cfg(test)] mod tests { use super::*; + use pest::Parser as PestParser; + use crate::parser::Parser; #[test] fn definitions() { diff --git a/src/error.rs b/src/error.rs index 6bef80ee..589db792 100644 --- a/src/error.rs +++ b/src/error.rs @@ -1,3 +1,4 @@ +use std::result; use thiserror::Error; use crate::parser::Rule; @@ -36,3 +37,5 @@ pub enum CozoError { #[error(transparent)] Parse(#[from] pest::error::Error), } + +pub type Result = result::Result; \ No newline at end of file diff --git a/src/eval.rs b/src/eval.rs index 0816ad2d..64cf4026 100644 --- a/src/eval.rs +++ b/src/eval.rs @@ -1,5 +1,6 @@ use crate::ast::Expr; use crate::ast::Expr::*; +use crate::error::Result; use crate::error::CozoError; use crate::error::CozoError::*; use crate::value::Value::*; @@ -22,8 +23,8 @@ impl Default for Evaluator { } } -impl<'a> ExprVisitor<'a, Result, CozoError>> for Evaluator { - fn visit_expr(&mut self, ex: &Expr<'a>) -> Result, CozoError> { +impl<'a> ExprVisitor<'a, Result>> for Evaluator { + fn visit_expr(&mut self, ex: &Expr<'a>) -> Result> { match ex { Apply(op, args) => { match op { @@ -55,7 +56,7 @@ impl<'a> ExprVisitor<'a, Result, CozoError>> for Evaluator { } impl Evaluator { - fn add_exprs<'a>(&mut self, exprs: &[Expr<'a>]) -> Result, CozoError> { + fn add_exprs<'a>(&mut self, exprs: &[Expr<'a>]) -> Result> { match exprs { [a, b] => { let a = self.visit_expr(a)?; @@ -84,7 +85,7 @@ impl Evaluator { } } - fn sub_exprs<'a>(&mut self, exprs: &[Expr<'a>]) -> Result, CozoError> { + fn sub_exprs<'a>(&mut self, exprs: &[Expr<'a>]) -> Result> { match exprs { [a, b] => { let a = self.visit_expr(a)?; @@ -109,7 +110,7 @@ impl Evaluator { } } - fn mul_exprs<'a>(&mut self, exprs: &[Expr<'a>]) -> Result, CozoError> { + fn mul_exprs<'a>(&mut self, exprs: &[Expr<'a>]) -> Result> { match exprs { [a, b] => { let a = self.visit_expr(a)?; @@ -135,7 +136,7 @@ impl Evaluator { } - fn div_exprs<'a>(&mut self, exprs: &[Expr<'a>]) -> Result, CozoError> { + fn div_exprs<'a>(&mut self, exprs: &[Expr<'a>]) -> Result> { match exprs { [a, b] => { let a = self.visit_expr(a)?; @@ -160,7 +161,7 @@ impl Evaluator { } } - fn mod_exprs<'a>(&mut self, exprs: &[Expr<'a>]) -> Result, CozoError> { + fn mod_exprs<'a>(&mut self, exprs: &[Expr<'a>]) -> Result> { match exprs { [a, b] => { let a = self.visit_expr(a)?; @@ -183,7 +184,7 @@ impl Evaluator { } - fn eq_exprs<'a>(&mut self, exprs: &[Expr<'a>]) -> Result, CozoError> { + fn eq_exprs<'a>(&mut self, exprs: &[Expr<'a>]) -> Result> { match exprs { [a, b] => { let a = self.visit_expr(a)?; @@ -201,7 +202,7 @@ impl Evaluator { } - fn ne_exprs<'a>(&mut self, exprs: &[Expr<'a>]) -> Result, CozoError> { + fn ne_exprs<'a>(&mut self, exprs: &[Expr<'a>]) -> Result> { match exprs { [a, b] => { let a = self.visit_expr(a)?; @@ -219,7 +220,7 @@ impl Evaluator { } - fn gt_exprs<'a>(&mut self, exprs: &[Expr<'a>]) -> Result, CozoError> { + fn gt_exprs<'a>(&mut self, exprs: &[Expr<'a>]) -> Result> { match exprs { [a, b] => { let a = self.visit_expr(a)?; @@ -245,7 +246,7 @@ impl Evaluator { } - fn ge_exprs<'a>(&mut self, exprs: &[Expr<'a>]) -> Result, CozoError> { + fn ge_exprs<'a>(&mut self, exprs: &[Expr<'a>]) -> Result> { match exprs { [a, b] => { let a = self.visit_expr(a)?; @@ -271,7 +272,7 @@ impl Evaluator { } - fn lt_exprs<'a>(&mut self, exprs: &[Expr<'a>]) -> Result, CozoError> { + fn lt_exprs<'a>(&mut self, exprs: &[Expr<'a>]) -> Result> { match exprs { [a, b] => { let a = self.visit_expr(a)?; @@ -296,7 +297,7 @@ impl Evaluator { } } - fn le_exprs<'a>(&mut self, exprs: &[Expr<'a>]) -> Result, CozoError> { + fn le_exprs<'a>(&mut self, exprs: &[Expr<'a>]) -> Result> { match exprs { [a, b] => { let a = self.visit_expr(a)?; @@ -322,7 +323,7 @@ impl Evaluator { } - fn pow_exprs<'a>(&mut self, exprs: &[Expr<'a>]) -> Result, CozoError> { + fn pow_exprs<'a>(&mut self, exprs: &[Expr<'a>]) -> Result> { match exprs { [a, b] => { let a = self.visit_expr(a)?; @@ -347,7 +348,7 @@ impl Evaluator { } } - fn coalesce_exprs<'a>(&mut self, exprs: &[Expr<'a>]) -> Result, CozoError> { + fn coalesce_exprs<'a>(&mut self, exprs: &[Expr<'a>]) -> Result> { match exprs { [a, b] => { let a = self.visit_expr(a)?; @@ -367,7 +368,7 @@ impl Evaluator { } } - fn negate_expr<'a>(&mut self, exprs: &[Expr<'a>]) -> Result, CozoError> { + fn negate_expr<'a>(&mut self, exprs: &[Expr<'a>]) -> Result> { Ok(match exprs { [a] => { match self.visit_expr(a)? { @@ -391,7 +392,7 @@ impl Evaluator { } - fn minus_expr<'a>(&mut self, exprs: &[Expr<'a>]) -> Result, CozoError> { + fn minus_expr<'a>(&mut self, exprs: &[Expr<'a>]) -> Result> { Ok(match exprs { [a] => { match self.visit_expr(a)? { @@ -408,7 +409,7 @@ impl Evaluator { } - fn test_null_expr<'a>(&mut self, exprs: &[Expr<'a>]) -> Result, CozoError> { + fn test_null_expr<'a>(&mut self, exprs: &[Expr<'a>]) -> Result> { Ok(match exprs { [a] => { match self.visit_expr(a)? { @@ -421,7 +422,7 @@ impl Evaluator { }) } - fn not_null_expr<'a>(&mut self, exprs: &[Expr<'a>]) -> Result, CozoError> { + fn not_null_expr<'a>(&mut self, exprs: &[Expr<'a>]) -> Result> { Ok(match exprs { [a] => { match self.visit_expr(a)? { @@ -434,7 +435,7 @@ impl Evaluator { }) } - fn or_expr<'a>(&mut self, exprs: &[Expr<'a>]) -> Result, CozoError> { + fn or_expr<'a>(&mut self, exprs: &[Expr<'a>]) -> Result> { let mut unevaluated = vec![]; let mut has_null = false; for expr in exprs { @@ -467,7 +468,7 @@ impl Evaluator { } - fn and_expr<'a>(&mut self, exprs: &[Expr<'a>]) -> Result, CozoError> { + fn and_expr<'a>(&mut self, exprs: &[Expr<'a>]) -> Result> { let mut unevaluated = vec![]; let mut no_null = true; for expr in exprs { diff --git a/src/parser.rs b/src/parser.rs index d8352e92..a63c7962 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -1,4 +1,3 @@ -use pest::Parser as PestParser; use pest_derive::Parser; @@ -10,6 +9,7 @@ pub struct Parser; #[cfg(test)] mod tests { use super::*; + use pest::Parser as PestParser; #[test] fn db() { @@ -66,9 +66,7 @@ mod tests { #[test] fn numbers() { assert_eq!(Parser::parse(Rule::number, "123").unwrap().as_str(), "123"); - assert_eq!(Parser::parse(Rule::number, "-123").unwrap().as_str(), "-123"); assert_eq!(Parser::parse(Rule::number, "0").unwrap().as_str(), "0"); - assert_eq!(Parser::parse(Rule::number, "-0").unwrap().as_str(), "-0"); assert_eq!(Parser::parse(Rule::number, "0123").unwrap().as_str(), "0123"); assert_eq!(Parser::parse(Rule::number, "000_1").unwrap().as_str(), "000_1"); assert!(Parser::parse(Rule::number, "_000_1").is_err()); @@ -81,7 +79,6 @@ mod tests { assert_eq!(Parser::parse(Rule::number, "123.45").unwrap().as_str(), "123.45"); assert_eq!(Parser::parse(Rule::number, "1_23.4_5_").unwrap().as_str(), "1_23.4_5_"); assert_ne!(Parser::parse(Rule::number, "123.").unwrap().as_str(), "123."); - assert_eq!(Parser::parse(Rule::number, "-123e-456").unwrap().as_str(), "-123e-456"); assert_eq!(Parser::parse(Rule::number, "123.333e456").unwrap().as_str(), "123.333e456"); assert_eq!(Parser::parse(Rule::number, "1_23.33_3e45_6").unwrap().as_str(), "1_23.33_3e45_6"); } diff --git a/src/typing.rs b/src/typing.rs index 38c7a7fd..7308d92b 100644 --- a/src/typing.rs +++ b/src/typing.rs @@ -1,5 +1,4 @@ use std::collections::BTreeMap; -use crate::ast::Op; use crate::env::{Env, LayeredEnv}; use crate::value::Value;