csvpp 0.8.0

Compile csv++ source code to a target spreadsheet format
Documentation
//! # `NumberFormat`
use crate::error::CellParseError;
use crate::parser::cell_lexer::TokenMatch;

#[derive(Copy, Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
pub enum NumberFormat {
    Currency,
    Date,
    DateTime,
    Number,
    Percent,
    #[default]
    Text,
    Time,
    Scientific,
}

impl TryFrom<TokenMatch> for NumberFormat {
    type Error = CellParseError;

    fn try_from(input: TokenMatch) -> Result<Self, Self::Error> {
        match input.str_match.to_lowercase().as_str() {
            "c" | "currency" => Ok(Self::Currency),
            "d" | "date" => Ok(Self::Date),
            "dt" | "datetime" => Ok(Self::DateTime),
            "n" | "number" => Ok(Self::Number),
            "p" | "percent" => Ok(Self::Percent),
            "text" => Ok(Self::Text), // TODO: think of a shortcut!!!
            "t" | "time" => Ok(Self::Time),
            "s" | "scientific" => Ok(Self::Scientific),
            _ => Err(CellParseError::new(
                "numberformat",
                input,
                &[
                    "currency (c)",
                    "date (d)",
                    "datetime (dt)",
                    "number (n)",
                    "percent (p)",
                    "text",
                    "time (t)",
                    "scientific (s)",
                ],
            )),
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::test_utils::*;

    #[test]
    fn try_from_currency() {
        assert_eq!(
            NumberFormat::Currency,
            NumberFormat::try_from(build_cell_token_match("c")).unwrap()
        );
        assert_eq!(
            NumberFormat::Currency,
            NumberFormat::try_from(build_cell_token_match("currency")).unwrap()
        );
        assert_eq!(
            NumberFormat::Currency,
            NumberFormat::try_from(build_cell_token_match("CURRENCY")).unwrap()
        );
    }

    #[test]
    fn try_from_date() {
        assert_eq!(
            NumberFormat::Date,
            NumberFormat::try_from(build_cell_token_match("d")).unwrap()
        );
        assert_eq!(
            NumberFormat::Date,
            NumberFormat::try_from(build_cell_token_match("date")).unwrap()
        );
        assert_eq!(
            NumberFormat::Date,
            NumberFormat::try_from(build_cell_token_match("DATE")).unwrap()
        );
    }

    #[test]
    fn try_from_datetime() {
        assert_eq!(
            NumberFormat::DateTime,
            NumberFormat::try_from(build_cell_token_match("dt")).unwrap()
        );
        assert_eq!(
            NumberFormat::DateTime,
            NumberFormat::try_from(build_cell_token_match("datetime")).unwrap()
        );
        assert_eq!(
            NumberFormat::DateTime,
            NumberFormat::try_from(build_cell_token_match("DATETIME")).unwrap()
        );
    }

    #[test]
    fn try_from_number() {
        assert_eq!(
            NumberFormat::Number,
            NumberFormat::try_from(build_cell_token_match("n")).unwrap()
        );
        assert_eq!(
            NumberFormat::Number,
            NumberFormat::try_from(build_cell_token_match("number")).unwrap()
        );
        assert_eq!(
            NumberFormat::Number,
            NumberFormat::try_from(build_cell_token_match("NUMBER")).unwrap()
        );
    }

    #[test]
    fn try_from_percent() {
        assert_eq!(
            NumberFormat::Percent,
            NumberFormat::try_from(build_cell_token_match("p")).unwrap()
        );
        assert_eq!(
            NumberFormat::Percent,
            NumberFormat::try_from(build_cell_token_match("percent")).unwrap()
        );
        assert_eq!(
            NumberFormat::Percent,
            NumberFormat::try_from(build_cell_token_match("PERCENT")).unwrap()
        );
    }

    #[test]
    fn try_from_text() {
        assert_eq!(
            NumberFormat::Text,
            NumberFormat::try_from(build_cell_token_match("text")).unwrap()
        );
        assert_eq!(
            NumberFormat::Text,
            NumberFormat::try_from(build_cell_token_match("TEXT")).unwrap()
        );
    }

    #[test]
    fn try_from_time() {
        assert_eq!(
            NumberFormat::Time,
            NumberFormat::try_from(build_cell_token_match("t")).unwrap()
        );
        assert_eq!(
            NumberFormat::Time,
            NumberFormat::try_from(build_cell_token_match("time")).unwrap()
        );
        assert_eq!(
            NumberFormat::Time,
            NumberFormat::try_from(build_cell_token_match("TIME")).unwrap()
        );
    }

    #[test]
    fn try_from_scientific() {
        assert_eq!(
            NumberFormat::Scientific,
            NumberFormat::try_from(build_cell_token_match("s")).unwrap()
        );
        assert_eq!(
            NumberFormat::Scientific,
            NumberFormat::try_from(build_cell_token_match("scientific")).unwrap()
        );
        assert_eq!(
            NumberFormat::Scientific,
            NumberFormat::try_from(build_cell_token_match("SCIENTIFIC")).unwrap()
        );
    }

    #[test]
    fn try_from_invalid() {
        assert!(NumberFormat::try_from(build_cell_token_match("foo")).is_err());
    }
}