diff --git a/examples/errors.rs b/examples/errors.rs index 782e5c0..f86bf68 100644 --- a/examples/errors.rs +++ b/examples/errors.rs @@ -1,6 +1,6 @@ use eww_config::{ format_diagnostic::ToDiagnostic, - parser::{ast::*, element::FromAst}, + parser::{ast::*, from_ast::FromAst}, }; fn main() { @@ -15,17 +15,16 @@ fn main() { let file_id = files.add("foo.eww", input); let ast = eww_config::parser::parse_string(file_id, input); - match ast.and_then(eww_config::parser::element::Element::::from_ast) { - Ok(ast) => { - println!("{:?}", ast); - } - Err(err) => { - dbg!(&err); - let diag = err.to_diagnostic(); - use codespan_reporting::term; - let config = term::Config::default(); - let mut writer = term::termcolor::StandardStream::stderr(term::termcolor::ColorChoice::Always); - term::emit(&mut writer, &config, &files, &diag).unwrap(); - } - } + // match ast.and_then(eww_config::parser::from_ast::Element::::from_ast) { + // Ok(ast) => { + // println!("{:?}", ast); + //} + // Err(err) => { + // dbg!(&err); + // let diag = err.to_diagnostic(); + // use codespan_reporting::term; + // let config = term::Config::default(); + // let mut writer = term::termcolor::StandardStream::stderr(term::termcolor::ColorChoice::Always); + // term::emit(&mut writer, &config, &files, &diag).unwrap(); + //} } diff --git a/examples/validation.rs b/examples/validation.rs index 9361975..f2cca38 100644 --- a/examples/validation.rs +++ b/examples/validation.rs @@ -2,7 +2,7 @@ use eww_config::{ config::{widget_definition::WidgetDefinition, widget_use::WidgetUse, *}, error::AstError, format_diagnostic::ToDiagnostic, - parser::element::FromAst, + parser::from_ast::FromAst, }; fn main() { diff --git a/src/config/config.rs b/src/config/config.rs index e34e766..17085b5 100644 --- a/src/config/config.rs +++ b/src/config/config.rs @@ -11,7 +11,7 @@ use crate::{ error::{AstError, AstResult, OptionAstErrorExt}, parser::{ ast::{Ast, AstIterator, Span}, - element::{Element, FromAst, FromAstElementContent}, + from_ast::{FromAst, FromAstElementContent}, }, spanned, value::{AttrName, VarName}, diff --git a/src/config/config_parse_error.rs b/src/config/config_parse_error.rs new file mode 100644 index 0000000..9a99b01 --- /dev/null +++ b/src/config/config_parse_error.rs @@ -0,0 +1,2 @@ +#[derive(Debug, thiserror::Error)] +pub enum ConfigParseError {} diff --git a/src/config/mod.rs b/src/config/mod.rs index 42c678c..39e20af 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -1,4 +1,5 @@ mod config; +pub mod config_parse_error; pub mod script_var_definition; #[cfg(test)] mod test; diff --git a/src/config/script_var_definition.rs b/src/config/script_var_definition.rs index 5801ca2..d245ced 100644 --- a/src/config/script_var_definition.rs +++ b/src/config/script_var_definition.rs @@ -6,7 +6,7 @@ use crate::{ error::{AstError, AstResult}, parser::{ ast::{Ast, AstIterator, Span}, - element::{Element, FromAst, FromAstElementContent}, + from_ast::{FromAst, FromAstElementContent}, }, spanned, value::{AttrName, VarName}, @@ -51,7 +51,7 @@ impl FromAstElementContent for PollScriptVar { let attrs: HashMap = iter.expect_key_values()?; let interval = attrs.get("interval").unwrap(); let interval = crate::util::parse_duration(interval).map_err(|e| AstError::Other(Some(span), e.into()))?; - let (_, script) = iter.expect_value()?; + let (_, script) = iter.expect_literal()?; Ok(Self { name: VarName(name), command: VarSource::Shell(script.to_string()), interval }) } } @@ -68,7 +68,7 @@ impl FromAstElementContent for TailScriptVar { fn from_tail>(span: Span, mut iter: AstIterator) -> AstResult { let (_, name) = iter.expect_symbol()?; - let (_, script) = iter.expect_value()?; + let (_, script) = iter.expect_literal()?; Ok(Self { name: VarName(name), command: script.to_string() }) } } diff --git a/src/config/test.rs b/src/config/test.rs index 9d9c454..593a683 100644 --- a/src/config/test.rs +++ b/src/config/test.rs @@ -3,7 +3,7 @@ use crate::{ parser::{ self, ast::{Ast, Span}, - element::FromAst, + from_ast::FromAst, lexer::Lexer, }, }; diff --git a/src/config/validate.rs b/src/config/validate.rs index d35c0cc..dc9678b 100644 --- a/src/config/validate.rs +++ b/src/config/validate.rs @@ -6,7 +6,7 @@ use crate::{ error::AstResult, parser::{ ast::{Ast, AstIterator, Span}, - element::{Element, FromAst}, + from_ast::FromAst, }, spanned, value::{AttrName, VarName}, diff --git a/src/config/var_definition.rs b/src/config/var_definition.rs index 3002980..37948cd 100644 --- a/src/config/var_definition.rs +++ b/src/config/var_definition.rs @@ -6,7 +6,7 @@ use crate::{ error::AstResult, parser::{ ast::{Ast, AstIterator, Span}, - element::{Element, FromAst, FromAstElementContent}, + from_ast::{FromAst, FromAstElementContent}, }, spanned, value::{AttrName, VarName}, @@ -26,7 +26,7 @@ impl FromAstElementContent for VarDefinition { fn from_tail>(span: Span, mut iter: AstIterator) -> AstResult { let (_, name) = iter.expect_symbol()?; - let (_, initial_value) = iter.expect_value()?; + let (_, initial_value) = iter.expect_literal()?; Ok(Self { name: VarName(name), initial_value, span }) } } diff --git a/src/config/widget_definition.rs b/src/config/widget_definition.rs index bb3764f..518286d 100644 --- a/src/config/widget_definition.rs +++ b/src/config/widget_definition.rs @@ -6,7 +6,7 @@ use crate::{ error::AstResult, parser::{ ast::{Ast, AstIterator, Span}, - element::{Element, FromAst, FromAstElementContent}, + from_ast::{FromAst, FromAstElementContent}, }, spanned, value::{AttrName, VarName}, diff --git a/src/config/widget_use.rs b/src/config/widget_use.rs index be29039..516b862 100644 --- a/src/config/widget_use.rs +++ b/src/config/widget_use.rs @@ -6,7 +6,7 @@ use crate::{ error::AstResult, parser::{ ast::{Ast, AstIterator, Span}, - element::{Element, FromAst}, + from_ast::FromAst, }, spanned, value::AttrName, @@ -23,7 +23,7 @@ impl FromAst for WidgetUse { fn from_ast(e: Ast) -> AstResult { let span = e.span(); spanned!(e.span(), { - if let Ok(text) = e.as_value_ref() { + if let Ok(text) = e.as_literal_ref() { Self { name: "text".to_string(), attrs: maplit::hashmap! { AttrName("text".to_string()) => SimplExpr::Literal(span.into(), text.clone()) }, diff --git a/src/parser/ast.rs b/src/parser/ast.rs index ed10d76..af1b513 100644 --- a/src/parser/ast.rs +++ b/src/parser/ast.rs @@ -4,7 +4,7 @@ use std::collections::HashMap; use std::fmt::Display; -use super::element::FromAst; +use super::from_ast::FromAst; use crate::error::{AstError, AstResult, OptionAstErrorExt}; #[derive(Eq, PartialEq, Clone, Copy, serde::Serialize)] @@ -34,9 +34,11 @@ pub enum AstType { Array, Keyword, Symbol, - Value, + Literal, SimplExpr, Comment, + // A value that could be used as a [SimplExpr] + IntoPrimitive, } impl Display for AstType { @@ -51,7 +53,7 @@ pub enum Ast { Array(Span, Vec), Keyword(Span, String), Symbol(Span, String), - Value(Span, DynVal), + Literal(Span, DynVal), SimplExpr(Span, SimplExpr), Comment(Span), } @@ -75,7 +77,7 @@ macro_rules! as_func { } impl Ast { - as_func!(AstType::Value, as_value as_value_ref = Ast::Value(_, x) => x); + as_func!(AstType::Literal, as_literal as_literal_ref = Ast::Literal(_, x) => x); as_func!(AstType::Symbol, as_symbol as_symbol_ref = Ast::Symbol(_, x) => x); @@ -89,7 +91,7 @@ impl Ast { Ast::Array(..) => AstType::Array, Ast::Keyword(..) => AstType::Keyword, Ast::Symbol(..) => AstType::Symbol, - Ast::Value(..) => AstType::Value, + Ast::Literal(..) => AstType::Literal, Ast::SimplExpr(..) => AstType::SimplExpr, Ast::Comment(_) => AstType::Comment, } @@ -101,16 +103,20 @@ impl Ast { Ast::Array(span, _) => *span, Ast::Keyword(span, _) => *span, Ast::Symbol(span, _) => *span, - Ast::Value(span, _) => *span, + Ast::Literal(span, _) => *span, Ast::SimplExpr(span, _) => *span, Ast::Comment(span) => *span, } } - pub fn first_list_elem(&self) -> Option<&Ast> { + pub fn as_simplexpr(self) -> AstResult { match self { - Ast::List(_, list) => list.first(), - _ => None, + // do I do this? + // Ast::Array(_, _) => todo!(), + // Ast::Symbol(_, _) => todo!(), + Ast::Literal(span, x) => Ok(SimplExpr::Literal(span.into(), x)), + Ast::SimplExpr(span, x) => Ok(x), + _ => Err(AstError::WrongExprType(Some(self.span()), AstType::IntoPrimitive, self.expr_type())), } } } @@ -123,7 +129,7 @@ impl std::fmt::Display for Ast { Array(_, x) => write!(f, "({})", x.iter().map(|e| format!("{}", e)).join(" ")), Keyword(_, x) => write!(f, ":{}", x), Symbol(_, x) => write!(f, "{}", x), - Value(_, x) => write!(f, "\"{}\"", x), + Literal(_, x) => write!(f, "\"{}\"", x), SimplExpr(_, x) => write!(f, "{{{}}}", x), Comment(_) => write!(f, ""), } @@ -170,7 +176,7 @@ macro_rules! return_or_put_back { impl> AstIterator { return_or_put_back!(expect_symbol, AstType::Symbol, (Span, String) = Ast::Symbol(span, x) => (span, x)); - return_or_put_back!(expect_value, AstType::Value, (Span, DynVal) = Ast::Value(span, x) => (span, x)); + return_or_put_back!(expect_literal, AstType::Literal, (Span, DynVal) = Ast::Literal(span, x) => (span, x)); return_or_put_back!(expect_list, AstType::List, (Span, Vec) = Ast::List(span, x) => (span, x)); diff --git a/src/parser/element.rs b/src/parser/from_ast.rs similarity index 65% rename from src/parser/element.rs rename to src/parser/from_ast.rs index 9bbff0a..8404439 100644 --- a/src/parser/element.rs +++ b/src/parser/from_ast.rs @@ -1,5 +1,5 @@ use super::ast::{Ast, AstIterator, AstType, Span}; -use crate::{error::*, parser, spanned, value::AttrName}; +use crate::{error::*, parser, spanned, util, value::AttrName}; use itertools::Itertools; use simplexpr::{ast::SimplExpr, dynval::DynVal}; use std::{ @@ -20,7 +20,7 @@ impl FromAst for Ast { impl FromAst for String { fn from_ast(e: Ast) -> AstResult { - Ok(e.as_value()?.as_string().unwrap()) + Ok(e.as_literal()?.as_string().unwrap()) } } @@ -50,31 +50,9 @@ impl FromAst for SimplExpr { fn from_ast(e: Ast) -> AstResult { match e { Ast::Symbol(span, x) => Ok(SimplExpr::VarRef(span.into(), x)), - Ast::Value(span, x) => Ok(SimplExpr::Literal(span.into(), x)), + Ast::Literal(span, x) => Ok(SimplExpr::Literal(span.into(), x)), Ast::SimplExpr(span, x) => Ok(x), _ => Err(AstError::NotAValue(Some(e.span()), e.expr_type())), } } } - -#[derive(Debug, Eq, PartialEq)] -pub struct Element { - name: String, - attrs: HashMap, - children: Vec, - span: Span, -} - -impl FromAst for Element { - fn from_ast(e: Ast) -> AstResult { - let span = e.span(); - spanned!(e.span(), { - let list = e.as_list()?; - let mut iter = AstIterator::new(list.into_iter()); - let (_, name) = iter.expect_symbol()?; - let attrs = iter.expect_key_values()?.into_iter().map(|(k, v)| (AttrName(k), v)).collect(); - let children = iter.map(C::from_ast).collect::>>()?; - Element { span, name, attrs, children } - }) - } -} diff --git a/src/parser/mod.rs b/src/parser/mod.rs index e8ed750..d0a99d2 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -8,7 +8,7 @@ use std::{fmt::Display, ops::Deref}; use itertools::Itertools; pub mod ast; -pub mod element; +pub mod from_ast; pub(crate) mod lexer; pub(crate) mod parse_error; diff --git a/src/parser/parser.lalrpop b/src/parser/parser.lalrpop index 7ecc91b..110c749 100644 --- a/src/parser/parser.lalrpop +++ b/src/parser/parser.lalrpop @@ -36,14 +36,14 @@ pub Ast: Ast = { => Ast::SimplExpr(Span(l, r, file_id), expr), => x, => x, - => Ast::Value(Span(l, r, file_id), x.into()), + => Ast::Literal(Span(l, r, file_id), x.into()), "comment" => Ast::Comment(Span(l, r, file_id)), }; Keyword: Ast = => Ast::Keyword(Span(l, r, file_id), x[1..].to_string()); Symbol: Ast = => Ast::Symbol(Span(l, r, file_id), x.to_string()); -Value: String = { +Literal: String = { => <>, => <>, => <>,