fastn-type 0.1.1

fastn: Full-stack Web Development Made Easy
Documentation
#[derive(Debug, Default, Clone, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct OrType {
    pub name: String,
    pub variants: Vec<fastn_type::OrTypeVariant>,
    pub line_number: usize,
}

impl fastn_type::OrType {
    pub fn new(
        name: &str,
        variants: Vec<fastn_type::OrTypeVariant>,
        line_number: usize,
    ) -> fastn_type::OrType {
        fastn_type::OrType {
            name: name.to_string(),
            variants,
            line_number,
        }
    }

    pub fn or_type_name(name: &str) -> String {
        if name.starts_with("ftd") {
            return name.to_string();
        }
        if let Some((_, last)) = name.rsplit_once('#') {
            return last.to_string();
        }
        name.to_string()
    }
}

#[derive(Debug, Clone, PartialEq, serde::Deserialize, serde::Serialize)]
pub enum OrTypeVariant {
    AnonymousRecord(fastn_type::Record),
    Regular(fastn_type::Field),
    Constant(fastn_type::Field),
}

impl fastn_type::OrTypeVariant {
    pub fn new_record(record: fastn_type::Record) -> fastn_type::OrTypeVariant {
        fastn_type::OrTypeVariant::AnonymousRecord(record)
    }

    pub fn new_constant(variant: fastn_type::Field) -> fastn_type::OrTypeVariant {
        fastn_type::OrTypeVariant::Constant(variant)
    }

    pub fn new_regular(variant: fastn_type::Field) -> fastn_type::OrTypeVariant {
        fastn_type::OrTypeVariant::Regular(variant)
    }

    pub fn is_constant(&self) -> bool {
        matches!(self, fastn_type::OrTypeVariant::Constant(_))
    }

    pub fn name(&self) -> String {
        match self {
            fastn_type::OrTypeVariant::AnonymousRecord(ar) => ar.name.to_string(),
            fastn_type::OrTypeVariant::Regular(r) => r.name.to_string(),
            fastn_type::OrTypeVariant::Constant(c) => c.name.to_string(),
        }
    }

    pub fn line_number(&self) -> usize {
        match self {
            fastn_type::OrTypeVariant::AnonymousRecord(ar) => ar.line_number,
            fastn_type::OrTypeVariant::Regular(r) => r.line_number,
            fastn_type::OrTypeVariant::Constant(c) => c.line_number,
        }
    }

    pub fn fields(&self) -> Vec<&fastn_type::Field> {
        match self {
            fastn_type::OrTypeVariant::AnonymousRecord(r) => r.fields.iter().collect(),
            fastn_type::OrTypeVariant::Regular(r) => vec![r],
            fastn_type::OrTypeVariant::Constant(c) => vec![c],
        }
    }
}