facti-api 0.2.0

Provides tools for interacting with Factorio REST APIs
use std::str::FromStr;

use serde::Serialize;
use strum::Display;

use crate::error::{ApiError, ApiErrorKind};

#[derive(Copy, Clone, Display, Debug, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum SortMode {
    Name,
    CreatedAt,
    UpdatedAt,
}

impl FromStr for SortMode {
    type Err = ApiError;

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        match s {
            s if s.eq_ignore_ascii_case("name") => Ok(SortMode::Name),
            s if s.eq_ignore_ascii_case("created_at")
                || s.eq_ignore_ascii_case("createdat")
                || s.eq_ignore_ascii_case("created") =>
            {
                Ok(SortMode::CreatedAt)
            }
            s if s.eq_ignore_ascii_case("updated_at")
                || s.eq_ignore_ascii_case("updatedat")
                || s.eq_ignore_ascii_case("updated") =>
            {
                Ok(SortMode::UpdatedAt)
            }
            _ => Err(ApiError::new(
                ApiErrorKind::InvalidSortMode,
                format!("{} is not a valid sort mode", s),
                None,
            )),
        }
    }
}

#[derive(Default, Copy, Clone, Display, Debug, Serialize)]
pub enum SortOrder {
    #[serde(rename = "asc")]
    Ascending,

    #[serde(rename = "desc")]
    #[default]
    Descending,
}

impl FromStr for SortOrder {
    type Err = ApiError;

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        match s {
            s if s.eq_ignore_ascii_case("asc") || s.eq_ignore_ascii_case("ascending") => {
                Ok(SortOrder::Ascending)
            }
            s if s.eq_ignore_ascii_case("desc") || s.eq_ignore_ascii_case("descending") => {
                Ok(SortOrder::Descending)
            }
            _ => Err(ApiError::new(
                ApiErrorKind::InvalidSortOrder,
                format!("{} is not a valid sort order", s),
                None,
            )),
        }
    }
}