rulemorph 0.3.4

YAML-based declarative data transformation engine for CSV/JSON to JSON
Documentation
use std::collections::HashMap;

mod go;
mod jvm;
mod python;
mod rust;
mod swift;
mod typescript;

use super::DtoLanguage;
use super::schema::{FieldType, SchemaNode, field_is_optional};
use super::support::field_identifier;

pub(super) use self::go::render_go;
pub(super) use self::jvm::{render_java, render_kotlin};
pub(super) use self::python::render_python;
pub(super) use self::rust::render_rust;
pub(super) use self::swift::render_swift;
pub(super) use self::typescript::render_typescript;

fn schema_has_optional(node: &SchemaNode) -> bool {
    for field in &node.fields {
        if field_is_optional(field) || field_type_has_optional(&field.field_type) {
            return true;
        }
    }
    false
}

fn field_type_has_optional(field_type: &FieldType) -> bool {
    match field_type {
        FieldType::Nullable(_) => true,
        FieldType::Object(child) => schema_has_optional(child),
        FieldType::Array(inner) | FieldType::Map(inner) => field_type_has_optional(inner),
        FieldType::Primitive(_) | FieldType::JsonValue => false,
    }
}

fn schema_has_rename(node: &SchemaNode, lang: DtoLanguage) -> bool {
    let mut used = HashMap::new();
    for field in &node.fields {
        let ident = field_identifier(lang, &field.key, &mut used);
        if ident != field.key {
            return true;
        }
        if field_type_has_rename(&field.field_type, lang) {
            return true;
        }
    }
    false
}

fn field_type_has_rename(field_type: &FieldType, lang: DtoLanguage) -> bool {
    match field_type {
        FieldType::Object(child) => schema_has_rename(child, lang),
        FieldType::Array(inner) | FieldType::Map(inner) | FieldType::Nullable(inner) => {
            field_type_has_rename(inner, lang)
        }
        FieldType::Primitive(_) | FieldType::JsonValue => false,
    }
}