diff --git a/crates/simplexpr/src/eval.rs b/crates/simplexpr/src/eval.rs index 5ee736e..227fa6f 100644 --- a/crates/simplexpr/src/eval.rs +++ b/crates/simplexpr/src/eval.rs @@ -10,7 +10,7 @@ use std::collections::HashMap; #[derive(Debug, thiserror::Error)] pub enum EvalError { #[error("Tried to reference variable `{0}`, but we cannot access variables here")] - NoVariablesAllowed(String), + NoVariablesAllowed(VarName), #[error("Invalid regex: {0}")] InvalidRegex(#[from] regex::Error), @@ -28,7 +28,7 @@ pub enum EvalError { UnknownFunction(String), #[error("Unknown variable {0}")] - UnknownVariable(String), + UnknownVariable(VarName), #[error("Unable to index into value {0}")] CannotIndex(String), @@ -116,7 +116,7 @@ impl SimplExpr { )), VarRef(span, ref name) => match variables.get(name) { Some(value) => Ok(Literal(span, value.clone())), - None => Err(EvalError::UnknownVariable(name.to_string()).at(span)), + None => Err(EvalError::UnknownVariable(name.clone()).at(span)), }, } } diff --git a/crates/yuck/src/format_diagnostic.rs b/crates/yuck/src/format_diagnostic.rs index 00e9ff8..e094245 100644 --- a/crates/yuck/src/format_diagnostic.rs +++ b/crates/yuck/src/format_diagnostic.rs @@ -11,6 +11,9 @@ use crate::{ use super::parser::parse_error; use eww_shared_util::{AttrName, Span, Spanned, VarName}; +fn span_to_primary_label(span: Span) -> Label { + Label::primary(span.2, span.0..span.1) +} fn span_to_secondary_label(span: Span) -> Label { Label::secondary(span.2, span.0..span.1) } @@ -189,7 +192,15 @@ impl ToDiagnostic for simplexpr::parser::lexer::LexicalError { impl ToDiagnostic for simplexpr::eval::EvalError { fn to_diagnostic(&self) -> Diagnostic { - gen_diagnostic!(self, self.span()) + use simplexpr::eval::EvalError::*; + match self { + UnresolvedVariable(name) | UnknownVariable(name) | NoVariablesAllowed(name) => gen_diagnostic! { + msg = self, + note = format!("If you meant to use the literal value \"{}\", surround the value in quotes", name) + }, + Spanned(span, error) => error.as_ref().to_diagnostic().with_label(span_to_primary_label(*span)), + _ => gen_diagnostic!(self, self.span()), + } } } diff --git a/crates/yuck/src/parser/lexer.rs b/crates/yuck/src/parser/lexer.rs index 222a8de..1b4650d 100644 --- a/crates/yuck/src/parser/lexer.rs +++ b/crates/yuck/src/parser/lexer.rs @@ -92,6 +92,8 @@ impl Lexer { } } +// TODO string literal interpolation stuff by looking for indexes of {{ and }}? + impl Iterator for Lexer { type Item = Result<(usize, Token, usize), parse_error::ParseError>; diff --git a/examples/eww-bar/eww.yuck b/examples/eww-bar/eww.yuck index d21e6e0..8ead5d1 100644 --- a/examples/eww-bar/eww.yuck +++ b/examples/eww-bar/eww.yuck @@ -45,11 +45,11 @@ (defpoll music :interval "5s" "playerctl metadata --format '{{ artist }} - {{ title }}' || true") (defpoll volume :interval "16s" "scripts/getvol") -(defpoll number_day :interval "5h" "date '+%d'") -(defpoll month :interval "10h" "date '+%b'") -(defpoll min :interval "10s" "date '+%M'") -(defpoll hour :interval "1m" "date '+%H'") -(defpoll year_full :interval "15h" "date '+%Y'") +(defpoll number_day :interval "5h" "date '+%d'") +(defpoll month :interval "10h" "date '+%b'") +(defpoll min :interval "10s" "date '+%M'") +(defpoll hour :interval "1m" "date '+%H'") +(defpoll year_full :interval "15h" "date '+%Y'") (deflisten battery-remaining "/sys/class/power_supply/BAT0/capacity")