mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-09 06:30:54 +00:00
don't return Option from required table field accessors (#4926)
This commit is contained in:
@@ -165,6 +165,24 @@ FullType GetFullType(const Type &type) {
|
||||
return ftBool;
|
||||
}
|
||||
|
||||
// If the second parameter is false then wrap the first with Option<...>
|
||||
std::string WrapInOptionIfNotRequired(std::string s, bool required) {
|
||||
if (required) {
|
||||
return s;
|
||||
} else {
|
||||
return "Option<" + s + ">";
|
||||
}
|
||||
}
|
||||
|
||||
// If the second parameter is false then add .unwrap()
|
||||
std::string AddUnwrapIfRequired(std::string s, bool required) {
|
||||
if (required) {
|
||||
return s + ".unwrap()";
|
||||
} else {
|
||||
return s;
|
||||
}
|
||||
}
|
||||
|
||||
namespace rust {
|
||||
|
||||
class RustGenerator : public BaseGenerator {
|
||||
@@ -967,11 +985,11 @@ class RustGenerator : public BaseGenerator {
|
||||
}
|
||||
case ftStruct: {
|
||||
const auto typname = WrapInNameSpace(*type.struct_def);
|
||||
return "Option<&" + lifetime + " " + typname + ">";
|
||||
return WrapInOptionIfNotRequired("&" + lifetime + " " + typname, field.required);
|
||||
}
|
||||
case ftTable: {
|
||||
const auto typname = WrapInNameSpace(*type.struct_def);
|
||||
return "Option<" + typname + "<" + lifetime + ">>";
|
||||
return WrapInOptionIfNotRequired(typname + "<" + lifetime + ">", field.required);
|
||||
}
|
||||
case ftEnumKey:
|
||||
case ftUnionKey: {
|
||||
@@ -980,38 +998,38 @@ class RustGenerator : public BaseGenerator {
|
||||
}
|
||||
|
||||
case ftUnionValue: {
|
||||
return "Option<flatbuffers::Table<" + lifetime + ">>";
|
||||
return WrapInOptionIfNotRequired("flatbuffers::Table<" + lifetime + ">", field.required);
|
||||
}
|
||||
case ftString: {
|
||||
return "Option<&" + lifetime + " str>";
|
||||
return WrapInOptionIfNotRequired("&" + lifetime + " str", field.required);
|
||||
}
|
||||
case ftVectorOfInteger:
|
||||
case ftVectorOfFloat: {
|
||||
const auto typname = GetTypeBasic(type.VectorType());
|
||||
if (IsOneByte(type.VectorType().base_type)) {
|
||||
return "Option<&" + lifetime + " [" + typname + "]>";
|
||||
return WrapInOptionIfNotRequired("&" + lifetime + " [" + typname + "]", field.required);
|
||||
}
|
||||
return "Option<flatbuffers::Vector<" + lifetime + ", " + typname + ">>";
|
||||
return WrapInOptionIfNotRequired("flatbuffers::Vector<" + lifetime + ", " + typname + ">", field.required);
|
||||
}
|
||||
case ftVectorOfBool: {
|
||||
return "Option<&" + lifetime + " [bool]>";
|
||||
return WrapInOptionIfNotRequired("&" + lifetime + " [bool]", field.required);
|
||||
}
|
||||
case ftVectorOfEnumKey: {
|
||||
const auto typname = WrapInNameSpace(*type.enum_def);
|
||||
return "Option<flatbuffers::Vector<" + lifetime + ", " + typname + ">>";
|
||||
return WrapInOptionIfNotRequired("flatbuffers::Vector<" + lifetime + ", " + typname + ">", field.required);
|
||||
}
|
||||
case ftVectorOfStruct: {
|
||||
const auto typname = WrapInNameSpace(*type.struct_def);
|
||||
return "Option<&" + lifetime + " [" + typname + "]>";
|
||||
return WrapInOptionIfNotRequired("&" + lifetime + " [" + typname + "]", field.required);
|
||||
}
|
||||
case ftVectorOfTable: {
|
||||
const auto typname = WrapInNameSpace(*type.struct_def);
|
||||
return "Option<flatbuffers::Vector<flatbuffers::ForwardsUOffset<" + \
|
||||
typname + "<" + lifetime + ">>>>";
|
||||
return WrapInOptionIfNotRequired("flatbuffers::Vector<flatbuffers::ForwardsUOffset<" + \
|
||||
typname + "<" + lifetime + ">>>", field.required);
|
||||
}
|
||||
case ftVectorOfString: {
|
||||
return "Option<flatbuffers::Vector<flatbuffers::ForwardsUOffset<&" + \
|
||||
lifetime + " str>>>";
|
||||
return WrapInOptionIfNotRequired("flatbuffers::Vector<flatbuffers::ForwardsUOffset<&" + \
|
||||
lifetime + " str>>", field.required);
|
||||
}
|
||||
case ftVectorOfUnionValue: {
|
||||
FLATBUFFERS_ASSERT(false && "vectors of unions are not yet supported");
|
||||
@@ -1041,17 +1059,17 @@ class RustGenerator : public BaseGenerator {
|
||||
}
|
||||
case ftStruct: {
|
||||
const auto typname = WrapInNameSpace(*type.struct_def);
|
||||
return "self._tab.get::<" + typname + ">(" + offset_name + ", None)";
|
||||
return AddUnwrapIfRequired("self._tab.get::<" + typname + ">(" + offset_name + ", None)", field.required);
|
||||
}
|
||||
case ftTable: {
|
||||
const auto typname = WrapInNameSpace(*type.struct_def);
|
||||
return "self._tab.get::<flatbuffers::ForwardsUOffset<" + typname + \
|
||||
"<" + lifetime + ">>>(" + offset_name + ", None)";
|
||||
return AddUnwrapIfRequired("self._tab.get::<flatbuffers::ForwardsUOffset<" + \
|
||||
typname + "<" + lifetime + ">>>(" + offset_name + ", None)", field.required);
|
||||
}
|
||||
case ftUnionValue: {
|
||||
return "self._tab.get::<flatbuffers::ForwardsUOffset<"
|
||||
return AddUnwrapIfRequired("self._tab.get::<flatbuffers::ForwardsUOffset<"
|
||||
"flatbuffers::Table<" + lifetime + ">>>(" + offset_name + \
|
||||
", None)";
|
||||
", None)", field.required);
|
||||
}
|
||||
case ftUnionKey:
|
||||
case ftEnumKey: {
|
||||
@@ -1062,8 +1080,8 @@ class RustGenerator : public BaseGenerator {
|
||||
", Some(" + default_value + ")).unwrap()";
|
||||
}
|
||||
case ftString: {
|
||||
return "self._tab.get::<flatbuffers::ForwardsUOffset<&str>>(" + \
|
||||
offset_name + ", None)";
|
||||
return AddUnwrapIfRequired("self._tab.get::<flatbuffers::ForwardsUOffset<&str>>(" + \
|
||||
offset_name + ", None)", field.required);
|
||||
}
|
||||
|
||||
case ftVectorOfInteger:
|
||||
@@ -1076,35 +1094,35 @@ class RustGenerator : public BaseGenerator {
|
||||
if (IsOneByte(type.VectorType().base_type)) {
|
||||
s += ".map(|v| v.safe_slice())";
|
||||
}
|
||||
return s;
|
||||
return AddUnwrapIfRequired(s, field.required);
|
||||
}
|
||||
case ftVectorOfBool: {
|
||||
return "self._tab.get::<flatbuffers::ForwardsUOffset<"
|
||||
return AddUnwrapIfRequired("self._tab.get::<flatbuffers::ForwardsUOffset<"
|
||||
"flatbuffers::Vector<" + lifetime + ", bool>>>(" + \
|
||||
offset_name + ", None).map(|v| v.safe_slice())";
|
||||
offset_name + ", None).map(|v| v.safe_slice())", field.required);
|
||||
}
|
||||
case ftVectorOfEnumKey: {
|
||||
const auto typname = WrapInNameSpace(*type.enum_def);
|
||||
return "self._tab.get::<flatbuffers::ForwardsUOffset<"
|
||||
return AddUnwrapIfRequired("self._tab.get::<flatbuffers::ForwardsUOffset<"
|
||||
"flatbuffers::Vector<" + lifetime + ", " + typname + ">>>(" + \
|
||||
offset_name + ", None)";
|
||||
offset_name + ", None)", field.required);
|
||||
}
|
||||
case ftVectorOfStruct: {
|
||||
const auto typname = WrapInNameSpace(*type.struct_def);
|
||||
return "self._tab.get::<flatbuffers::ForwardsUOffset<"
|
||||
return AddUnwrapIfRequired("self._tab.get::<flatbuffers::ForwardsUOffset<"
|
||||
"flatbuffers::Vector<" + typname + ">>>(" + \
|
||||
offset_name + ", None).map(|v| v.safe_slice() )";
|
||||
offset_name + ", None).map(|v| v.safe_slice() )", field.required);
|
||||
}
|
||||
case ftVectorOfTable: {
|
||||
const auto typname = WrapInNameSpace(*type.struct_def);
|
||||
return "self._tab.get::<flatbuffers::ForwardsUOffset<"
|
||||
return AddUnwrapIfRequired("self._tab.get::<flatbuffers::ForwardsUOffset<"
|
||||
"flatbuffers::Vector<flatbuffers::ForwardsUOffset<" + typname + \
|
||||
"<" + lifetime + ">>>>>(" + offset_name + ", None)";
|
||||
"<" + lifetime + ">>>>>(" + offset_name + ", None)", field.required);
|
||||
}
|
||||
case ftVectorOfString: {
|
||||
return "self._tab.get::<flatbuffers::ForwardsUOffset<"
|
||||
return AddUnwrapIfRequired("self._tab.get::<flatbuffers::ForwardsUOffset<"
|
||||
"flatbuffers::Vector<flatbuffers::ForwardsUOffset<&" + \
|
||||
lifetime + " str>>>>(" + offset_name + ", None)";
|
||||
lifetime + " str>>>>(" + offset_name + ", None)", field.required);
|
||||
}
|
||||
case ftVectorOfUnionValue: {
|
||||
FLATBUFFERS_ASSERT(false && "vectors of unions are not yet supported");
|
||||
@@ -1449,19 +1467,8 @@ class RustGenerator : public BaseGenerator {
|
||||
// must only be called if the field key is defined.
|
||||
void GenKeyFieldMethods(const FieldDef &field) {
|
||||
FLATBUFFERS_ASSERT(field.key);
|
||||
const bool is_string = (field.value.type.base_type == BASE_TYPE_STRING);
|
||||
|
||||
if (is_string) {
|
||||
code_.SetValue("KEY_TYPE", "Option<&str>");
|
||||
} else {
|
||||
FLATBUFFERS_ASSERT(IsScalar(field.value.type.base_type));
|
||||
auto type = GetTypeBasic(field.value.type);
|
||||
if (parser_.opts.scoped_enums && field.value.type.enum_def &&
|
||||
IsScalar(field.value.type.base_type)) {
|
||||
type = GetTypeGet(field.value.type);
|
||||
}
|
||||
code_.SetValue("KEY_TYPE", type);
|
||||
}
|
||||
code_.SetValue("KEY_TYPE", GenTableAccessorFuncReturnType(field, ""));
|
||||
|
||||
code_ += " #[inline]";
|
||||
code_ += " pub fn key_compare_less_than(&self, o: &{{STRUCT_NAME}}) -> "
|
||||
|
||||
Reference in New Issue
Block a user