go-away 0.6.1

Generates go types from rust types
Documentation
use std::fmt::Display;

use crate::output::prelude::*;

pub struct KSerializer<'a> {
    target_name: &'a str,
    serializer_name: String,
    serialize_body: String,
    deserialize_body: String,
    descriptor: String,
    additional_members: String,
}

impl<'a> KSerializer<'a> {
    pub fn new(target_name: &'a str) -> Self {
        KSerializer {
            target_name,
            serialize_body: String::new(),
            deserialize_body: String::new(),
            serializer_name: format!("{}Serializer", target_name),
            descriptor: String::new(),
            additional_members: String::new(),
        }
    }

    pub fn descriptor(&mut self, descriptor: impl Display) {
        self.descriptor = descriptor.to_string();
    }

    pub fn with_descriptor(mut self, descriptor: impl Display) -> Self {
        self.descriptor(descriptor);
        self
    }

    pub fn serialize_body(&mut self, serialize_body: impl Display) {
        let mut f = indented(&mut self.serialize_body);
        write!(indented(&mut f), "{serialize_body}").unwrap();
    }

    pub fn with_serialize_body(mut self, serialize_body: impl Display) -> Self {
        self.serialize_body(serialize_body);
        self
    }

    pub fn deserialize_body(&mut self, deserialize_body: impl Display) {
        let mut f = indented(&mut self.deserialize_body);
        write!(indented(&mut f), "{deserialize_body}").unwrap();
    }

    pub fn with_deserialize_body(mut self, deserialize_body: impl Display) -> Self {
        self.deserialize_body(deserialize_body);
        self
    }

    pub fn additional_members(&mut self, additional_members: impl Display) {
        let mut f = indented(&mut self.additional_members);
        write!(f, "{additional_members}").unwrap();
    }

    pub fn with_additional_members(mut self, additional_members: impl Display) -> Self {
        self.additional_members(additional_members);
        self
    }
}

impl Display for KSerializer<'_> {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        let KSerializer {
            target_name,
            serializer_name,
            serialize_body,
            deserialize_body,
            descriptor,
            additional_members,
        } = self;
        writedoc!(
            f,
            r#"
                object {serializer_name} : KSerializer<{target_name}> {{
                {additional_members}
            "#
        )?;
        writeln!(
            indented(f),
            "override val descriptor: SerialDescriptor = {descriptor}"
        )?;
        writedoc!(
            f,
            r#"
                    override fun serialize(encoder: Encoder, value: {target_name}) {{
                {serialize_body}
                    }}

                    override fun deserialize(decoder: Decoder): {target_name} {{
                {deserialize_body}
                    }}
                }}
            "#
        )
    }
}