rockscript 0.2.0

Esolang called Rockscript
use std::ops;

use crate::lexer::Token;

#[derive(Debug, Clone)]
pub enum Statement {
    VarDef {
        name: String,
        value: Box<SpannedExpr>,
    },

    FnDef {
        name: String,
        params: Vec<String>,
        body: Vec<SpannedStatement>,
    },

    Return(Box<SpannedExpr>),

    BinaryOp {
        operation: BinaryOp,
        variable: String,
        value: Box<SpannedExpr>,
    },

    If {
        condition: Box<SpannedExpr>,
        body: Vec<SpannedStatement>,
        else_: Option<Vec<SpannedStatement>>,
    },

    While {
        condition: Box<SpannedExpr>,
        body: Vec<SpannedStatement>,
    },

    Break,

    Print(Box<SpannedExpr>),

    Expr(Box<SpannedExpr>),
}

#[derive(Debug, Clone)]
pub struct SpannedStatement {
    pub statement: Statement,
    pub span: ops::Range<usize>,
}

#[derive(Debug, Clone)]
pub enum Expression {
    Number(f64),
    Str(String),
    Boolean(bool),
    Identifier(String),

    FnCall {
        name: String,
        args: Vec<SpannedExpr>,
    },

    Weigh {
        left: Box<SpannedExpr>,
        right: Box<SpannedExpr>,
    },
}

#[derive(Debug, Clone)]
pub struct SpannedExpr {
    pub expr: Expression,
    pub span: ops::Range<usize>
}

#[derive(Debug, Clone)]
pub enum BinaryOp {
    Add,
    Sub,
    Mul,
    Div,
}

impl BinaryOp {
    pub fn from_token(token: Token) -> BinaryOp {
        match token {
            Token::Smash => BinaryOp::Add,
            Token::Chip => BinaryOp::Sub,
            Token::Mate => BinaryOp::Mul,
            Token::Split => BinaryOp::Div,
            _ => panic!("cant parse token into binary operation, this shouldnt panic unless theres a bug in the interpreter"),
        }
    }
}