math-parser-rs 0.1.0

A simple handwritten dsl for interpreting math.
Documentation
use crate::dsl::ast_types::{AstNode, OperatorKind};

pub fn rewrite_cos_as_sin(node: &AstNode) -> AstNode {
    match node {
        AstNode::FunctionCall { name, args } if name == "cos" && args.len() == 1 => {
            AstNode::FunctionCall {
                name: "sin".to_string(),
                args: vec![AstNode::BinaryOp {
                    op: OperatorKind::Plus,
                    left: Box::new(rewrite_cos_as_sin(&args[0])),
                    right: Box::new(AstNode::Number(std::f64::consts::FRAC_PI_2)), // π/2
                }],
            }
        }
        AstNode::FunctionCall { name, args } => AstNode::FunctionCall {
            name: name.clone(),
            args: args.iter().map(rewrite_cos_as_sin).collect(),
        },
        AstNode::BinaryOp { op, left, right } => AstNode::BinaryOp {
            op: *op,
            left: Box::new(rewrite_cos_as_sin(left)),
            right: Box::new(rewrite_cos_as_sin(right)),
        },
        AstNode::Number(n) => AstNode::Number(*n),
        AstNode::Variable(v) => AstNode::Variable(v.clone()),
    }
}