symrs/
lib.rs

1use std::{
2    any::{Any, type_name_of_val},
3    fmt,
4};
5
6pub mod abc;
7pub mod expr;
8pub mod system;
9pub use expr::Equation;
10pub use expr::*;
11pub use system::System;
12
13pub enum KnownExpr<'a> {
14    Add(&'a Add),
15    Mul(&'a Mul),
16    Pow(&'a Pow),
17    Integer(&'a Integer),
18    Symbol(&'a Symbol),
19    Integral(&'a Integral),
20    Rational(&'a Rational),
21    Diff(&'a Diff),
22    Eq(&'a Equation),
23    Unknown,
24}
25
26impl<'a> KnownExpr<'a> {
27    pub fn from_expr_box(expr: &Box<dyn Expr>) -> KnownExpr {
28        KnownExpr::from_expr(&**expr)
29    }
30
31    pub fn from_expr(expr: &dyn Expr) -> KnownExpr {
32        let expr = (&*expr) as &dyn Any;
33        if expr.is::<Add>() {
34            KnownExpr::Add(expr.downcast_ref::<Add>().unwrap())
35        } else if expr.is::<Mul>() {
36            KnownExpr::Mul(expr.downcast_ref::<Mul>().unwrap())
37        } else if expr.is::<Pow>() {
38            KnownExpr::Pow(expr.downcast_ref::<Pow>().unwrap())
39        } else if expr.is::<Integer>() {
40            KnownExpr::Integer(expr.downcast_ref::<Integer>().unwrap())
41        } else if expr.is::<Symbol>() {
42            KnownExpr::Symbol(expr.downcast_ref::<Symbol>().unwrap())
43        } else if let Some(integral) = expr.downcast_ref::<Integral>() {
44            KnownExpr::Integral(integral)
45        } else if let Some(eq) = expr.downcast_ref::<Equation>() {
46            KnownExpr::Eq(eq)
47        } else if let Some(rational) = expr.downcast_ref::<Rational>() {
48            KnownExpr::Rational(rational)
49        } else {
50            KnownExpr::Unknown
51        }
52    }
53}