use super::super::types::FieldResolver;
impl FieldResolver {
pub fn is_declared_field_display_safe(&self, type_name: &str, field_name: &str) -> bool {
self.ir_result_field_map
.display_safe_fields
.get(type_name)
.is_some_and(|fields| fields.contains(field_name))
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::core::ir::{FieldDef, PrimitiveType, TypeDef, TypeRef};
use std::collections::{HashMap, HashSet};
fn field(name: &str, ty: TypeRef) -> FieldDef {
FieldDef {
name: name.to_string(),
ty,
..FieldDef::default()
}
}
fn resolver_for(type_defs: &[TypeDef]) -> FieldResolver {
let map = FieldResolver::ir_result_field_facts(type_defs, "rust");
FieldResolver::new(
&HashMap::new(),
&HashSet::new(),
&HashSet::new(),
&HashSet::new(),
&HashSet::new(),
)
.with_ir_result_fields(map, None)
}
fn table_type_defs() -> Vec<TypeDef> {
vec![TypeDef {
name: "Table".to_string(),
fields: vec![
field("name", TypeRef::String),
field("row_count", TypeRef::Primitive(PrimitiveType::U32)),
field("cells", TypeRef::Vec(Box::new(TypeRef::Vec(Box::new(TypeRef::String))))),
field("owner", TypeRef::Named("Person".to_string())),
],
..TypeDef::default()
}]
}
#[test]
fn a_string_field_is_display_safe() {
let resolver = resolver_for(&table_type_defs());
assert!(resolver.is_declared_field_display_safe("Table", "name"));
assert!(resolver.is_declared_field_display_safe("Table", "row_count"));
}
#[test]
fn a_nested_vec_field_is_not_display_safe() {
let resolver = resolver_for(&table_type_defs());
assert!(!resolver.is_declared_field_display_safe("Table", "cells"));
}
#[test]
fn a_named_struct_field_is_not_display_safe() {
let resolver = resolver_for(&table_type_defs());
assert!(!resolver.is_declared_field_display_safe("Table", "owner"));
}
#[test]
fn an_unknown_field_or_type_is_not_display_safe() {
let resolver = resolver_for(&table_type_defs());
assert!(!resolver.is_declared_field_display_safe("Table", "nonexistent"));
assert!(!resolver.is_declared_field_display_safe("UnknownType", "name"));
}
}