don't return Option from required table field accessors (#4926)

This commit is contained in:
kzvi
2018-09-26 21:11:25 -07:00
committed by Robert
parent c56fff88a2
commit 43132560f9
3 changed files with 73 additions and 69 deletions

View File

@@ -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}}) -> "