///|
fn CodeGenerator::field_storage_shape(
self : CodeGenerator,
field : Field,
parent_path : ImportPath,
) -> FieldStorageShape raise {
let field_name = field.import_path.name() |> pascal_to_snake
let field_type = self.get_moonbit_type(field, parent_path~)
let mut declaration_type = field_type
let mut constructor_name = field_name
let mut constructor_type = field_type
let mut default_expr = "Default::default()"
if field.map_key_value() is Some(map_entry) {
let key_type = self.get_moonbit_type(map_entry.fields[0], parent_path~)
let value_type = self.get_moonbit_type(map_entry.fields[1], parent_path~)
let map_type = "Map[\{key_type}, \{value_type}]"
declaration_type = map_type
constructor_type = map_type
default_expr = "{}"
} else if field.is_list() {
let array_type = "Array[\{field_type}]"
declaration_type = array_type
constructor_type = array_type
default_expr = "[]"
} else if field.is_optional() {
declaration_type = "\{field_type}?"
constructor_name = "\{field_name}?"
default_expr = "None"
} else if field.is_message() || field.is_enum() {
declaration_type = "\{field_type} "
}
if field.default_value() is Some(default_value) {
let mut field_default_value = default_value
if field.type_ is Some(TYPE_STRING) {
field_default_value = "\"\{field_default_value}\""
} else if field.is_enum() {
field_default_value = "\{field_type}::\{default_value}"
}
if field.is_optional() {
field_default_value = "Some(\{field_default_value})"
}
default_expr = field_default_value
}
{
field_name,
declaration_type,
constructor_name,
constructor_type,
default_expr,
}
}