go-away 0.6.1

Generates go types from rust types
Documentation
use crate::{
    output::prelude::*,
    types::{self},
};

use super::to_screaming_snake_case;

pub struct Enum<'a> {
    name: &'a str,
    variants: Vec<Variant<'a>>,
}

impl<'a> Enum<'a> {
    pub fn new(name: &'a str) -> Enum<'a> {
        Enum {
            name,
            variants: Vec::new(),
        }
    }

    pub fn with_variants(mut self, fields: &'a [types::EnumVariant]) -> Self {
        self.variants.extend(fields.iter().map(Into::into));
        self
    }
}

struct Variant<'a> {
    name: String,
    serde_name: &'a str,
}

impl<'a> From<&'a types::EnumVariant> for Variant<'a> {
    fn from(val: &'a types::EnumVariant) -> Self {
        Variant {
            name: to_screaming_snake_case(&val.name),
            serde_name: &val.serialized_name,
        }
    }
}

impl fmt::Display for Enum<'_> {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        let name = &self.name;
        writeln!(f, "@Serializable")?;
        writeln!(f, "public enum class {name} {{")?;
        writeln_for!(
            indented(f),
            Variant{name, serde_name } in &self.variants,
            r#"@SerialName("{serde_name}") {name},"#
        );
        writeln!(f, "}}\n")
    }
}