use super::super::super::types::{FieldResolver, SwiftFirstClassMap};
impl FieldResolver {
pub fn leaf_is_json_bridged_via_swift_map(&self, field: &str) -> bool {
if let Some(answer) = self.swift_leaf_is_json_bridged(field) {
return answer;
}
let leaf = field.split('.').next_back().unwrap_or(field);
let leaf = leaf.split('[').next().unwrap_or(leaf);
self.swift_first_class_map.is_json_bridged_field_name(leaf)
}
pub fn swift_leaf_is_json_bridged(&self, field: &str) -> Option<bool> {
self.swift_leaf_fact(field, |map, owner, leaf| map.json_bridged_getter(owner, leaf))
}
pub(super) fn swift_leaf_fact(
&self,
field: &str,
fact: impl Fn(&SwiftFirstClassMap, &str, &str) -> Option<bool>,
) -> Option<bool> {
let map = &self.swift_first_class_map;
let resolved = self.resolve(field);
let segments: Vec<&str> = resolved.split('.').filter(|s| !s.is_empty()).collect();
let last = segments.len().checked_sub(1)?;
let mut current = self
.ir_collection_map
.root_type
.clone()
.or_else(|| self.ir_enum_map.root_type.clone())
.or_else(|| map.root_type.clone())?;
for (index, segment) in segments.iter().enumerate() {
let bare = segment.split('[').next().unwrap_or(segment);
if index == last && !segment.contains('[') {
return fact(map, ¤t, bare);
}
current = map.advance(Some(¤t), bare)?;
}
None
}
pub fn swift_leaf_getter_is_optional(&self, field: &str) -> Option<bool> {
self.swift_leaf_fact(field, |map, owner, leaf| map.getter_is_optional(owner, leaf))
}
}