rulemorph 0.3.1

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, node_has_required};
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 {
        match &field.field_type {
            FieldType::Object(child) => {
                if !node_has_required(child) || schema_has_optional(child) {
                    return true;
                }
            }
            _ => {
                if field.optional {
                    return true;
                }
            }
        }
    }
    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 let FieldType::Object(child) = &field.field_type {
            if schema_has_rename(child, lang) {
                return true;
            }
        }
    }
    false
}