use super::super::super::ir_enum::{enum_type_at_path, is_enum_path};
use super::super::super::types::FieldResolver;
use super::super::super::types::WasmEnumRepresentation;
impl FieldResolver {
pub(crate) fn wasm_enum_representation(&self, field: &str) -> Option<WasmEnumRepresentation<'_>> {
let enum_name = self.ir_enum_type_name(field)?;
if self.wasm_untagged_enum_names.contains(&enum_name) {
return Some(WasmEnumRepresentation::Untagged);
}
match self.ir_enum_map.tagged_enum_wire.get(&enum_name) {
Some(wire) => Some(WasmEnumRepresentation::Tagged { tag: &wire.tag }),
None => Some(WasmEnumRepresentation::External),
}
}
pub fn is_enum(&self, field: &str) -> bool {
let resolved = self.resolve(field);
if self.enum_fields.contains(field) || self.enum_fields.contains(resolved) {
return true;
}
is_enum_path(&self.ir_enum_map, resolved)
}
pub fn ir_enum_type_name(&self, field: &str) -> Option<String> {
let resolved = self.resolve(field);
enum_type_at_path(&self.ir_enum_map, resolved)
}
pub fn union_variant_payload(&self, union_type: &str, variant: &str) -> Option<(&str, &str)> {
self.ir_enum_map
.variant_payload_types
.get(union_type)?
.get(variant)
.map(|(field_name, type_name)| (field_name.as_str(), type_name.as_str()))
}
pub fn union_variant_payload_is_collection(&self, union_type: &str, variant: &str) -> bool {
self.ir_enum_map
.variant_payload_is_collection
.get(union_type)
.is_some_and(|variants| variants.contains(variant))
}
pub fn enum_variant_for_wire_value(&self, field: &str, wire: &str) -> Option<&str> {
let enum_name = self.ir_enum_type_name(field)?;
self.ir_enum_map
.enum_wire_variants
.get(&enum_name)?
.get(wire)
.map(String::as_str)
}
pub fn enum_wire_value_for_variant(&self, field: &str, variant: &str) -> Option<&str> {
let enum_name = self.ir_enum_type_name(field)?;
self.ir_enum_map
.enum_wire_variants
.get(&enum_name)?
.iter()
.find(|(_, identifier)| identifier.as_str() == variant)
.map(|(wire, _)| wire.as_str())
}
pub fn tagged_enum_wire_discriminator(&self, union_type: &str, variant: &str) -> Option<(&str, &str)> {
let wire = self.ir_enum_map.tagged_enum_wire.get(union_type)?;
Some((wire.tag.as_str(), wire.variants.get(variant)?.as_str()))
}
pub fn tagged_enum_content_key(&self, union_type: &str) -> Option<&str> {
self.ir_enum_map.tagged_enum_wire.get(union_type)?.content.as_deref()
}
pub fn ir_enum_is_data_carrying(&self, field: &str) -> Option<bool> {
let name = self.ir_enum_type_name(field)?;
Some(self.ir_enum_map.data_carrying_enum_names.contains(&name))
}
pub fn java_enum_emits_get_value(&self, field: &str) -> Option<bool> {
let name = self.ir_enum_type_name(field)?;
Some(!self.java_wrapper_enum_names.contains(&name))
}
pub fn ruby_enum_serialized_as_hash(&self, field: &str) -> Option<bool> {
let name = self.ir_enum_type_name(field)?;
Some(self.ruby_hash_serialized_enum_names.contains(&name))
}
}