alef 0.107.9

Opinionated polyglot binding generator for Rust libraries
Documentation
use super::*;

#[test]
fn named_map_keys_and_values_convert_in_both_directions() {
    let ty = TypeRef::Map(
        Box::new(TypeRef::Named("SourceRole".into())),
        Box::new(TypeRef::Named("OperationSource".into())),
    );
    for optional in [false, true] {
        let from = field_conversion_from_core("sources", &ty, optional, false, &AHashSet::new());
        let to = field_conversion_to_core("sources", &ty, optional);
        assert!(from.contains("(k.into(), v.into())"), "{from}");
        assert!(to.contains("(k.into(), v.into())"), "{to}");
    }
    let wrapped = TypeRef::Optional(Box::new(ty.clone()));
    assert_eq!(
        field_conversion_to_core("sources", &wrapped, false),
        field_conversion_to_core("sources", &ty, true)
    );
    assert_eq!(
        field_conversion_from_core("sources", &wrapped, false, false, &AHashSet::new()),
        field_conversion_from_core("sources", &ty, true, false, &AHashSet::new())
    );
}

#[test]
fn nested_json_maps_convert_each_value_without_dropping_entries() {
    let ty = TypeRef::Vec(Box::new(TypeRef::Map(
        Box::new(TypeRef::String),
        Box::new(TypeRef::Json),
    )));
    for optional in [false, true] {
        let from = field_conversion_from_core("records", &ty, optional, false, &AHashSet::new());
        let to = field_conversion_to_core("records", &ty, optional);
        assert_eq!(
            field_conversion_from_core_cfg(
                "records",
                &ty,
                optional,
                false,
                &AHashSet::new(),
                &ConversionConfig::default()
            ),
            from
        );
        assert_eq!(
            field_conversion_to_core_cfg("records", &ty, optional, &ConversionConfig::default()),
            to
        );
        let prefix = if optional {
            "records: val.records.map(|items| items.into_iter()"
        } else {
            "records: val.records.into_iter()"
        };
        assert!(from.starts_with(prefix), "{from}");
        assert!(to.starts_with(prefix), "{to}");
        assert!(from.contains("(k, v.to_string())"), "{from}");
        assert!(
            to.contains("serde_json::from_str(&v).unwrap_or(serde_json::Value::String(v))"),
            "{to}"
        );
        assert!(!from.contains("filter_map"));
        assert!(!to.contains("filter_map"));
    }
    let wrapped = TypeRef::Optional(Box::new(ty.clone()));
    assert_eq!(
        field_conversion_from_core("records", &wrapped, false, false, &AHashSet::new()),
        field_conversion_from_core("records", &ty, true, false, &AHashSet::new())
    );
    assert_eq!(
        field_conversion_to_core("records", &wrapped, false),
        field_conversion_to_core("records", &ty, true)
    );
}