raekna-common 0.1.1

This crate contains common types and functionality for the raekna project.
Documentation
use std::{fmt, str::FromStr};

use crate::errors::{CommonError, CommonResult};

#[derive(Debug, Copy, Clone, PartialEq)]
pub enum FunctionName {
    SquareRoot,
    Factorial,
    Max,
    Min,
    Add,
    Subtract,
    Multiply,
    Divide,
    Modulus,
    Power,
}

impl FunctionName {
    pub fn num_arguments(&self) -> usize {
        match self {
            FunctionName::SquareRoot | FunctionName::Factorial => 1,
            FunctionName::Max
            | FunctionName::Min
            | FunctionName::Add
            | FunctionName::Subtract
            | FunctionName::Multiply
            | FunctionName::Divide
            | FunctionName::Modulus
            | FunctionName::Power => 2,
        }
    }
}

impl FromStr for FunctionName {
    type Err = CommonError;

    fn from_str(arg: &str) -> CommonResult<Self> {
        match arg.to_lowercase().as_str() {
            "sqrt" | "squareroot" | "square_root" => Ok(Self::SquareRoot),
            "fact" | "factorial" => Ok(Self::Factorial),
            "min" | "minimum" => Ok(Self::Min),
            "max" | "maximum" => Ok(Self::Max),
            "add" => Ok(Self::Add),
            "sub" | "subtract" => Ok(Self::Subtract),
            "mul" | "multiply" => Ok(Self::Multiply),
            "div" | "divide" => Ok(Self::Divide),
            "mod" | "modulus" => Ok(Self::Modulus),
            "pow" | "power" => Ok(Self::Power),
            _ => Err(CommonError::UnknownFunctionName(arg.to_owned())),
        }
    }
}

impl fmt::Display for FunctionName {
    fn fmt(&self, fmt: &mut fmt::Formatter) -> std::result::Result<(), std::fmt::Error> {
        match self {
            FunctionName::SquareRoot => write!(fmt, "sqrt"),
            FunctionName::Factorial => write!(fmt, "factorial"),
            FunctionName::Max => write!(fmt, "max"),
            FunctionName::Min => write!(fmt, "min"),
            FunctionName::Add => write!(fmt, "add"),
            FunctionName::Subtract => write!(fmt, "sub"),
            FunctionName::Multiply => write!(fmt, "mul"),
            FunctionName::Divide => write!(fmt, "div"),
            FunctionName::Modulus => write!(fmt, "mod"),
            FunctionName::Power => write!(fmt, "pow"),
        }
    }
}