Ruopt enum (#6156)

* Rust support for optional enums

* make optional_scalars2 for languages that support optional enums

Co-authored-by: Casper Neo <cneo@google.com>
This commit is contained in:
Casper
2020-10-02 10:30:39 -07:00
committed by GitHub
parent bbcc85fd4c
commit 8ec8322f09
6 changed files with 143 additions and 24 deletions

View File

@@ -673,6 +673,9 @@ class RustGenerator : public BaseGenerator {
}
case ftUnionKey:
case ftEnumKey: {
if (field.optional) {
return "None";
}
auto ev = field.value.type.enum_def->FindByValue(field.value.constant);
assert(ev);
return WrapInNameSpace(field.value.type.enum_def->defined_namespace,
@@ -724,7 +727,7 @@ class RustGenerator : public BaseGenerator {
case ftEnumKey:
case ftUnionKey: {
const auto typname = WrapInNameSpace(*type.enum_def);
return typname;
return field.optional ? "Option<" + typname + ">" : typname;
}
case ftUnionValue: {
return "Option<flatbuffers::WIPOffset<flatbuffers::UnionWIPOffset>>";
@@ -872,7 +875,9 @@ class RustGenerator : public BaseGenerator {
case ftEnumKey:
case ftUnionKey: {
const auto underlying_typname = GetTypeBasic(type);
return "self.fbb_.push_slot::<" + underlying_typname + ">";
return (field.optional ?
"self.fbb_.push_slot_always::<" :
"self.fbb_.push_slot::<") + underlying_typname + ">";
}
case ftStruct: {
@@ -925,7 +930,7 @@ class RustGenerator : public BaseGenerator {
case ftEnumKey:
case ftUnionKey: {
const auto typname = WrapInNameSpace(*type.enum_def);
return typname;
return field.optional ? "Option<" + typname + ">" : typname;
}
case ftUnionValue: {
@@ -1027,8 +1032,12 @@ class RustGenerator : public BaseGenerator {
const auto underlying_typname = GetTypeBasic(type); //<- never used
const auto typname = WrapInNameSpace(*type.enum_def);
const auto default_value = GetDefaultScalarValue(field);
return "self._tab.get::<" + typname + ">(" + offset_name + ", Some(" +
default_value + ")).unwrap()";
if (field.optional) {
return "self._tab.get::<" + typname + ">(" + offset_name + ", None)";
} else {
return "self._tab.get::<" + typname + ">(" + offset_name + ", Some(" +
default_value + ")).unwrap()";
}
}
case ftString: {
return AddUnwrapIfRequired(