postcard-bindgen-core 0.7.1

A crate to generate bindings for the postcard binary format for other languages than Rust - Core Crate
Documentation
use genco::quote;

use crate::{
    code_gen::{
        import_registry::{ImportItem, Package},
        python::{
            generateable::types::PythonTypeGenerateable, FieldAccessor, ImportRegistry, Tokens,
            VariableAccess, VariablePath,
        },
        utils::{ContainerFullQualifiedTypeBuilder, TokensIterExt},
    },
    registry::{ContainerInfo, StructType},
};

use super::BindingTypeGenerateable;

impl BindingTypeGenerateable for StructType {
    fn gen_ser_body(&self, _container_info: ContainerInfo<'_>) -> Tokens {
        self.fields
            .iter()
            .map(|field| {
                field.v_type.gen_ser_accessor(
                    VariablePath::default().modify_push(VariableAccess::Field(field.name.into())),
                )
            })
            .join_with_line_breaks()
    }

    fn gen_des_body(&self, container_info: ContainerInfo<'_>) -> Tokens {
        let fully_qualified = ContainerFullQualifiedTypeBuilder::from(&container_info).build();
        let body = self
            .fields
            .iter()
            .map(|field| {
                field
                    .v_type
                    .gen_des_accessor(FieldAccessor::Object(field.name))
            })
            .join_with_comma();
        quote!(return $fully_qualified($body))
    }

    fn gen_ty_check_body(&self, container_info: ContainerInfo<'_>) -> Tokens {
        let fully_qualified = ContainerFullQualifiedTypeBuilder::from(&container_info).build();
        let variable_path = VariablePath::default();

        let field_checks = self
            .fields
            .iter()
            .map(|field| {
                field.v_type.gen_ty_check(
                    variable_path
                        .to_owned()
                        .modify_push(VariableAccess::Field(field.name.into())),
                )
            })
            .join_with_line_breaks();

        [
            quote!(assert isinstance($(variable_path.to_owned()), $(&fully_qualified)), "{} is not of type {}".format($variable_path, $fully_qualified)),
            field_checks
        ]
        .into_iter()
        .join_with_line_breaks()
    }

    fn gen_typings_body(
        &self,
        container_info: ContainerInfo<'_>,
        import_registry: &mut ImportRegistry,
    ) -> Tokens {
        let body = self
            .fields
            .iter()
            .map(|field| quote!($(field.name): $(field.v_type.gen_typings(import_registry))))
            .join_with_line_breaks();
        import_registry.push(
            Package::Extern("dataclasses".into()),
            ImportItem::Single("dataclass".into()),
        );
        quote! {
            @dataclass
            class $(container_info.name.as_ref()):
                $body
        }
    }
}