From 9c60e7a9cd975aa44fe599aa883a7c951ec83005 Mon Sep 17 00:00:00 2001 From: Camden Dixie O'Brien Date: Sat, 26 Sep 2026 09:44:10 +0100 Subject: [PATCH] Implement std::str::FromStr for Expression --- src/parse.rs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/parse.rs b/src/parse.rs index b177bc0..489fa70 100644 --- a/src/parse.rs +++ b/src/parse.rs @@ -1,6 +1,7 @@ use crate::token::Token; use crate::expression::Expression; use crate::binding::{Binding, Power}; +use crate::lex::TokenSource; #[derive(Debug)] pub enum Error { @@ -8,6 +9,14 @@ pub enum Error { InvalidSyntax, } +impl std::str::FromStr for Expression { + type Err = Error; + + fn from_str(s: &str) -> Result { + parse(TokenSource::new(std::io::Cursor::new(s))) + } +} + pub fn parse(input: I) -> Result where I: Iterator> { @@ -484,4 +493,20 @@ mod tests { let result = parse(tokens.into_iter().map(|t| Ok(t))); std::assert_matches!(result, Err(Error::InvalidSyntax)); } + + #[test] + fn expressions_can_be_read_from_string() { + let expr = "x - y".parse::().unwrap(); + assert_eq!( + expr, + Expression::difference( + Expression::Symbol('x'), + Expression::Symbol('y'))); + } + + #[test] + fn reading_string_with_invalid_syntax_yields_error() { + let result = "(x + 1".parse::(); + assert!(matches!(result, Err(Error::InvalidSyntax))); + } }