tovuk 0.1.56

Deploy Rust backends, static frontends, and fullstack apps to Tovuk.
use serde::{Serialize, Serializer};

#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub(crate) enum ProjectKind {
    Fullstack,
    RustBackend,
    StaticFrontend,
}

impl ProjectKind {
    pub(crate) fn parse(value: &str) -> std::result::Result<Self, String> {
        match value {
            "fullstack" => Ok(Self::Fullstack),
            "rust_backend" => Ok(Self::RustBackend),
            "static_frontend" => Ok(Self::StaticFrontend),
            _ => Err("kind must be fullstack, rust_backend, or static_frontend".to_owned()),
        }
    }

    pub(crate) const fn as_str(self) -> &'static str {
        match self {
            Self::Fullstack => "fullstack",
            Self::RustBackend => "rust_backend",
            Self::StaticFrontend => "static_frontend",
        }
    }

    pub(crate) const fn sort_order(self) -> u8 {
        match self {
            Self::RustBackend => 0,
            Self::Fullstack => 1,
            Self::StaticFrontend => 2,
        }
    }

    pub(crate) const fn supports_database(self) -> bool {
        matches!(self, Self::Fullstack | Self::RustBackend)
    }

    pub(crate) const fn is_fullstack(self) -> bool {
        matches!(self, Self::Fullstack)
    }

    pub(crate) const fn is_static_frontend(self) -> bool {
        matches!(self, Self::StaticFrontend)
    }

    pub(crate) const fn is_rust_backend(self) -> bool {
        matches!(self, Self::RustBackend)
    }
}

impl Serialize for ProjectKind {
    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        serializer.serialize_str(self.as_str())
    }
}