[TS] Add Obj API (#5788)

* added basic code

* backup work

* got class property to work

* backup progress

* implementented fmt for creating code

* added docs for genFieldUtils

* back up work

* added base helper js func

* added union js code

* added unpackTo and base for pack

* added pack code

* added null check for packing struct list

* passes compile test

* fixed some spacing of generated functions

* added annotations for constructors

* added obj api unpack test

* tested pack to work

* merge branch

* separated js and ts test

* fixed union signature to include string

* fixed generator to support string union

* hardcoded fb builder name

* refactored struct vector creation

* work around createLong

* handle default value in constructor

* update typescript docs

* added notes about import flag

* fixed formatting stuffs

* undo TypescriptTest change

* refactored fmt

* updated generated code

* remove ignoring union_vector for js

* revert changes for .project

* revert changes for package.json

* don't generate js in ts test

* fixed android project file

* removed unused js function

* removed package-lock.json

* adjust createObjList to new signature

* changed regex to callback style

* fixed package.json

* used existing func for generating annotation

* changed ternary to !!

* added return type for lambda

* removed callback style for obj api generator

* fixed js file indentation

* removed unused header

* added tests for string only union

* handle string only union and refactor union conv func

* updated generated ts files

* renamed union conv func

* made js test create files like other languages

* removed union string only handling

* don't allow null in createObjectOffsetList

* updated generated ts code

* changed the line that triggers Windows build errors

* hopefully fix CI error
This commit is contained in:
Khoi Dinh Trinh
2020-04-09 09:53:16 -07:00
committed by GitHub
parent 21cf300f4c
commit 003e164057
12 changed files with 2159 additions and 57 deletions

1
.gitignore vendored
View File

@@ -72,6 +72,7 @@ tests/monsterdata_rust_wire.mon
tests/unicode_test.mon
tests/ts/
tests/php/
tests/js/
CMakeLists.txt.user
CMakeScripts/**
CTestTestfile.cmake

View File

@@ -60,6 +60,38 @@ Now you can access values like this:
let pos = monster.pos();
~~~
## Object based API
FlatBuffers is all about memory efficiency, which is why its base API is written
around using as little as possible of it. This does make the API clumsier
(requiring pre-order construction of all data, and making mutation harder).
For times when efficiency is less important a more convenient object based API
can be used (through `--gen-object-api`) that is able to unpack & pack a
FlatBuffer into objects and standard TS types.
**When using the obj based API, the flatbuffers import need to be in the global namespace if you don't have `--no-fb-import` enabled** since creating default values require accessing the `flatbuffers.js` file.
To use:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.ts}
// Autogenerated class from table Monster.
let monsterobj = new MonsterT();
// Deserialize from buffer into object.
Monster.getRootAsMonster(flatbuffer).unpackTo(monsterobj);
// or
let monsterobj = Monster.getRootAsMonster(flatbuffer).unpack();
// Update object directly like a regular TS class instance.
console.log(monsterobj.name);
monsterobj.name = "Bob";
// Serialize into new flatbuffer.
let fbb = new flatbuffers.Builder(1);
Monster.finishMonsterBuffer(fbb, monsterobj.pack(fbb));
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
## Text parsing FlatBuffers in TypeScript
There currently is no support for parsing text (Schema's and JSON) directly

View File

@@ -54,6 +54,15 @@ flatbuffers.FILE_IDENTIFIER_LENGTH = 4;
*/
flatbuffers.SIZE_PREFIX_LENGTH = 4;
/**
* @param {number} low
* @param {number} high
* @returns {flatbuffers.Long}
*/
flatbuffers.createLong = function(low, high) {
return flatbuffers.Long.create(low, high);
};
/**
* @enum {number}
*/
@@ -830,6 +839,52 @@ flatbuffers.Builder.prototype.createString = function(s) {
flatbuffers.Builder.prototype.createLong = function(low, high) {
return flatbuffers.Long.create(low, high);
};
/**
* A helper function to pack an object
*
* @returns offset of obj
*/
flatbuffers.Builder.prototype.createObjectOffset = function(obj) {
if(obj === null) {
return 0
}
if(typeof obj === 'string') {
return this.createString(obj);
} else {
return obj.pack(this);
}
}
/**
* A helper function to pack a list of object
*
* @returns list of offsets of each non null object
*/
flatbuffers.Builder.prototype.createObjectOffsetList = function(list) {
let ret = [];
for(let i = 0; i < list.length; ++i) {
let val = list[i];
if(val !== null) {
ret.push(this.createObjectOffset(val));
} else {
throw new Error(
'FlatBuffers: Argument for createObjectOffsetList cannot contain null.');
}
}
return ret;
};
flatbuffers.Builder.prototype.createStructOffsetList = function(list, startFunc) {
startFunc(this, list.length);
this.createObjectOffsetList(list);
return this.endVector();
}
////////////////////////////////////////////////////////////////////////////////
/// @cond FLATBUFFERS_INTERNAL
/**
@@ -1195,6 +1250,24 @@ flatbuffers.ByteBuffer.prototype.__string = function(offset, opt_encoding) {
return result;
};
/**
* Handle unions that can contain string as its member, if a Table-derived type then initialize it,
* if a string then return a new one
*
* WARNING: strings are immutable in JS so we can't change the string that the user gave us, this
* makes the behaviour of __union_with_string different compared to __union
*
* @param {flatbuffers.Table|string} o
* @param {number} offset
* @returns {flatbuffers.Table|string}
*/
flatbuffers.ByteBuffer.prototype.__union_with_string = function(o, offset) {
if(typeof o === 'string') {
return this.__string(offset);
}
return this.__union(o, offset);
};
/**
* Retrieve the relative offset stored at "offset"
* @param {number} offset
@@ -1252,6 +1325,48 @@ flatbuffers.ByteBuffer.prototype.createLong = function(low, high) {
return flatbuffers.Long.create(low, high);
};
/**
* A helper function for generating list for obj api
* @param listAccessor function that accepts an index and return data at that index
* @param {number} listLength
* @returns {any[]}
*/
flatbuffers.ByteBuffer.prototype.createScalarList = function(listAccessor, listLength) {
let ret = [];
for(let i = 0; i < listLength; ++i) {
if(listAccessor(i) !== null) {
ret.push(listAccessor(i));
}
}
return ret;
};
/**
* This function is here only to get around typescript type system
*/
flatbuffers.ByteBuffer.prototype.createStringList = function(listAccessor, listLength) {
return this.createScalarList(listAccessor, listLength);
};
/**
* A helper function for generating list for obj api
* @param listAccessor function that accepts an index and return data at that index
* @param listLength {number} listLength
* @param res any[] result list
*/
flatbuffers.ByteBuffer.prototype.createObjList = function(listAccessor, listLength) {
let ret = [];
for(let i = 0; i < listLength; ++i) {
let val = listAccessor(i);
if(val !== null) {
ret.push(val.unpack());
}
}
return ret;
};
// Exports for Node.js and RequireJS
this.flatbuffers = flatbuffers;

View File

@@ -374,9 +374,16 @@ class JsTsGenerator : public BaseGenerator {
std::make_pair(ev.union_type.struct_def->file, std::move(desc)));
}
}
code += "};";
if (lang_.language == IDLOptions::kTs && !ns.empty()) { code += "}"; }
code += "};\n\n";
if (lang_.language == IDLOptions::kTs) {
if (enum_def.is_union) {
code += GenUnionConvFunc(enum_def.underlying_type);
}
if (!ns.empty()) { code += "\n}"; }
}
code += "\n\n";
}
static std::string GenType(const Type &type) {
@@ -404,7 +411,12 @@ class JsTsGenerator : public BaseGenerator {
switch (type.base_type) {
case BASE_TYPE_STRING: return GenBBAccess() + ".__string" + arguments;
case BASE_TYPE_STRUCT: return GenBBAccess() + ".__struct" + arguments;
case BASE_TYPE_UNION: return GenBBAccess() + ".__union" + arguments;
case BASE_TYPE_UNION:
if (!UnionHasStringType(*type.enum_def) ||
lang_.language == IDLOptions::kJs) {
return GenBBAccess() + ".__union" + arguments;
}
return GenBBAccess() + ".__union_with_string" + arguments;
case BASE_TYPE_VECTOR: return GenGetter(type.VectorType(), arguments);
default: {
auto getter =
@@ -426,7 +438,8 @@ class JsTsGenerator : public BaseGenerator {
}
std::string GenDefaultValue(const Value &value, const std::string &context) {
if (value.type.enum_def) {
if (value.type.enum_def && value.type.base_type != BASE_TYPE_UNION &&
value.type.base_type != BASE_TYPE_VECTOR) {
if (auto val = value.type.enum_def->FindByValue(value.constant)) {
if (lang_.language == IDLOptions::kTs) {
return GenPrefixedTypeName(WrapInNameSpace(*value.type.enum_def),
@@ -446,7 +459,13 @@ class JsTsGenerator : public BaseGenerator {
switch (value.type.base_type) {
case BASE_TYPE_BOOL: return value.constant == "0" ? "false" : "true";
case BASE_TYPE_STRING: return "null";
case BASE_TYPE_STRING:
case BASE_TYPE_UNION:
case BASE_TYPE_STRUCT: {
return "null";
}
case BASE_TYPE_VECTOR: return "[]";
case BASE_TYPE_LONG:
case BASE_TYPE_ULONG: {
@@ -549,6 +568,10 @@ class JsTsGenerator : public BaseGenerator {
return GenFileNamespacePrefix(file) + "." + typeName;
}
std::string GenFullNameSpace(const Definition &def, const std::string &file) {
return GenPrefixedTypeName(GetNameSpace(def), file);
}
void GenStructArgs(const StructDef &struct_def, std::string *annotations,
std::string *arguments, const std::string &nameprefix) {
for (auto it = struct_def.fields.vec.begin();
@@ -668,6 +691,527 @@ class JsTsGenerator : public BaseGenerator {
}
}
static std::string GetObjApiClassName(const StructDef &sd,
const IDLOptions &opts) {
return GetObjApiClassName(sd.name, opts);
}
static std::string GetObjApiClassName(const std::string &name,
const IDLOptions &opts) {
return opts.object_prefix + name + opts.object_suffix;
}
bool UnionHasStringType(const EnumDef &union_enum) {
return std::any_of(union_enum.Vals().begin(), union_enum.Vals().end(),
[](const EnumVal *ev) {
return !(ev->IsZero()) &&
(ev->union_type.base_type == BASE_TYPE_STRING);
});
}
std::string GenUnionGenericTypeTS(const EnumDef &union_enum) {
return std::string("T") + (UnionHasStringType(union_enum) ? "|string" : "");
}
std::string GenUnionTypeTS(const EnumDef &union_enum) {
std::string ret;
std::set<std::string> type_list;
for (auto it = union_enum.Vals().begin(); it != union_enum.Vals().end();
++it) {
const auto &ev = **it;
if (ev.IsZero()) { continue; }
std::string type = "";
if (ev.union_type.base_type == BASE_TYPE_STRING) {
type = "string"; // no need to wrap string type in namespace
} else if (ev.union_type.base_type == BASE_TYPE_STRUCT) {
type = GenPrefixedTypeName(WrapInNameSpace(*(ev.union_type.struct_def)),
union_enum.file);
} else {
FLATBUFFERS_ASSERT(false);
}
type_list.insert(type);
}
for (auto it = type_list.begin(); it != type_list.end(); ++it) {
ret += *it + ((std::next(it) == type_list.end()) ? "" : "|");
}
return ret;
}
// Generate a TS union type based on a union's enum
std::string GenObjApiUnionTypeTS(const IDLOptions &opts,
const EnumDef &union_enum) {
std::string ret = "";
std::set<std::string> type_list;
for (auto it = union_enum.Vals().begin(); it != union_enum.Vals().end();
++it) {
const auto &ev = **it;
if (ev.IsZero()) { continue; }
std::string type = "";
if (ev.union_type.base_type == BASE_TYPE_STRING) {
type = "string"; // no need to wrap string type in namespace
} else if (ev.union_type.base_type == BASE_TYPE_STRUCT) {
type = GenPrefixedTypeName(
GetObjApiClassName(WrapInNameSpace(*(ev.union_type.struct_def)),
opts),
union_enum.file);
} else {
FLATBUFFERS_ASSERT(false);
}
type_list.insert(type);
}
size_t totalPrinted = 0;
for (auto it = type_list.begin(); it != type_list.end(); ++it) {
++totalPrinted;
ret += *it + ((totalPrinted == type_list.size()) ? "" : "|");
}
return ret;
}
std::string GenUnionConvFuncName(const EnumDef &enum_def) {
return "unionTo" + enum_def.name;
}
std::string GenUnionListConvFuncName(const EnumDef &enum_def) {
return "unionListTo" + enum_def.name;
}
std::string GenUnionConvFunc(const Type &union_type) {
if (union_type.enum_def) {
const auto &enum_def = *union_type.enum_def;
const auto valid_union_type = GenUnionTypeTS(enum_def);
const auto valid_union_type_with_null = valid_union_type + "|null";
auto ret = "\n\nexport function " + GenUnionConvFuncName(enum_def) +
"(\n type: " + enum_def.name +
",\n accessor: (obj:" + valid_union_type + ") => " +
valid_union_type_with_null +
"\n): " + valid_union_type_with_null + " {\n";
const auto enum_type = GenPrefixedTypeName(
WrapInNameSpace(*(union_type.enum_def)), union_type.enum_def->file);
const auto &union_enum = *(union_type.enum_def);
const auto union_enum_loop = [&](const std::string &accessor_str) {
ret += " switch(" + enum_type + "[type]) {\n";
ret += " case 'NONE': return null; \n";
for (auto it = union_enum.Vals().begin(); it != union_enum.Vals().end();
++it) {
const auto &ev = **it;
if (ev.IsZero()) { continue; }
ret += " case '" + ev.name + "': ";
if (ev.union_type.base_type == BASE_TYPE_STRING) {
ret += "return " + accessor_str + "'') as string;";
} else if (ev.union_type.base_type == BASE_TYPE_STRUCT) {
const auto type = GenPrefixedTypeName(
WrapInNameSpace(*(ev.union_type.struct_def)), union_enum.file);
ret += "return " + accessor_str + "new " + type + "())! as " +
type + ";";
} else {
FLATBUFFERS_ASSERT(false);
}
ret += "\n";
}
ret += " default: return null;\n";
ret += " }\n";
};
union_enum_loop("accessor(");
ret += "}";
ret += "\n\nexport function " + GenUnionListConvFuncName(enum_def) +
"(\n type: " + enum_def.name +
", \n accessor: (index: number, obj:" + valid_union_type +
") => " + valid_union_type_with_null +
", \n index: number\n): " + valid_union_type_with_null + " {\n";
union_enum_loop("accessor(index, ");
ret += "}";
return ret;
}
FLATBUFFERS_ASSERT(0);
return "";
}
// Used for generating a short function that returns the correct class
// based on union enum type. Assume the context is inside the non object api
// type
std::string GenUnionValTS(const std::string &field_name,
const Type &union_type,
const bool is_array = false) {
if (union_type.enum_def) {
const auto &enum_def = *union_type.enum_def;
const auto enum_type =
GenPrefixedTypeName(WrapInNameSpace(enum_def), enum_def.file);
const std::string union_accessor = "this." + field_name;
const auto union_has_string = UnionHasStringType(enum_def);
const auto field_binded_method = "this." + field_name + ".bind(this)";
std::string ret = "";
if (!is_array) {
const auto conversion_function =
GenPrefixedTypeName(WrapInNameSpace(enum_def.defined_namespace,
GenUnionConvFuncName(enum_def)),
enum_def.file);
const auto target_enum = "this." + field_name + "Type()";
ret = "(() => {\n";
ret += " let temp = " + conversion_function + "(" + target_enum +
", " + field_binded_method + ");\n";
ret += " if(temp === null) { return null; }\n";
ret += union_has_string
? " if(typeof temp === 'string') { return temp; }\n"
: "";
ret += " return temp.unpack()\n";
ret += " })()";
} else {
const auto conversion_function = GenPrefixedTypeName(
WrapInNameSpace(enum_def.defined_namespace,
GenUnionListConvFuncName(enum_def)),
enum_def.file);
const auto target_enum_accesor = "this." + field_name + "Type";
const auto target_enum_length = target_enum_accesor + "Length()";
ret = "(() => {\n";
ret += " let ret = [];\n";
ret += " for(let targetEnumIndex = 0; targetEnumIndex < " +
target_enum_length +
"; "
"++targetEnumIndex) {\n";
ret += " let targetEnum = " + target_enum_accesor +
"(targetEnumIndex);\n";
ret += " if(targetEnum === null || " + enum_type +
"[targetEnum!] === 'NONE') { "
"continue; }\n\n";
ret += " let temp = " + conversion_function + "(targetEnum, " +
field_binded_method + ", targetEnumIndex);\n";
ret += " if(temp === null) { continue; }\n";
ret += union_has_string ? " if(typeof temp === 'string') { "
"ret.push(temp); continue; }\n"
: "";
ret += " ret.push(temp.unpack());\n";
ret += " }\n";
ret += " return ret;\n";
ret += " })()";
}
return ret;
}
FLATBUFFERS_ASSERT(0);
return "";
}
std::string GenNullCheckConditional(const std::string &nullCheckVar,
const std::string &trueVal,
const std::string &falseVal = "null") {
return "(" + nullCheckVar + " !== null ? " + trueVal + " : " + falseVal +
")";
}
std::string GenStructMemberValueTS(const StructDef &struct_def,
const std::string &prefix,
const std::string &delimiter,
const bool nullCheck = true) {
std::string ret;
for (auto it = struct_def.fields.vec.begin();
it != struct_def.fields.vec.end(); ++it) {
auto &field = **it;
const auto curr_member_accessor =
prefix + "." + MakeCamel(field.name, false);
if (IsStruct(field.value.type)) {
ret += GenStructMemberValueTS(*field.value.type.struct_def,
curr_member_accessor, delimiter);
} else {
if (nullCheck) {
ret +=
"(" + prefix + " === null ? 0 : " + curr_member_accessor + "!)";
} else {
ret += curr_member_accessor;
}
}
if (std::next(it) != struct_def.fields.vec.end()) { ret += delimiter; }
}
return ret;
}
void GenObjApi(const Parser &parser, StructDef &struct_def,
std::string &obj_api_unpack_func, std::string &obj_api_class) {
const auto class_name = GetObjApiClassName(struct_def, parser.opts);
std::string unpack_func =
"\n/**\n * " + GenTypeAnnotation(kReturns, class_name, "") +
" */\nunpack(): " + class_name + " {\n return new " + class_name +
"(" + (struct_def.fields.vec.empty() ? "" : "\n");
std::string unpack_to_func =
"/**\n * " + GenTypeAnnotation(kParam, class_name, "_o") +
" */\nunpackTo(_o: " + class_name + "): void {" +
+(struct_def.fields.vec.empty() ? "" : "\n");
std::string constructor_annotation = "/**\n * @constructor";
constructor_annotation += (struct_def.fields.vec.empty() ? "" : "\n");
std::string constructor_func = "constructor(";
constructor_func += (struct_def.fields.vec.empty() ? "" : "\n");
std::string pack_func_prototype =
"/**\n * " +
GenTypeAnnotation(kParam, "flatbuffers.Builder", "builder") + " * " +
GenTypeAnnotation(kReturns, "flatbuffers.Offset", "") +
" */\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\n";
std::string pack_func_offset_decl;
std::string pack_func_create_call =
" return " + Verbose(struct_def) + ".create" + Verbose(struct_def) +
"(builder" + (struct_def.fields.vec.empty() ? "" : ",\n ");
if (struct_def.fixed) {
// when packing struct, nested struct's members instead of the struct's
// offset are used
pack_func_create_call +=
GenStructMemberValueTS(struct_def, "this", ",\n ", false) + "\n ";
}
for (auto it = struct_def.fields.vec.begin();
it != struct_def.fields.vec.end(); ++it) {
auto &field = **it;
if (field.deprecated) continue;
const auto field_name = MakeCamel(field.name, false);
const std::string field_binded_method =
"this." + field_name + ".bind(this)";
std::string field_val;
std::string field_type;
// a string that declares a variable containing the
// offset for things that can't be generated inline
// empty otw
std::string field_offset_decl;
// a string that contains values for things that can be created inline or
// the variable name from field_offset_decl
std::string field_offset_val;
const auto field_default_val =
GenDefaultValue(field.value, "flatbuffers");
// Emit a scalar field
if (IsScalar(field.value.type.base_type) ||
field.value.type.base_type == BASE_TYPE_STRING) {
if (field.value.type.enum_def) {
field_type +=
GenPrefixedTypeName(GenTypeName(field.value.type, false, true),
field.value.type.enum_def->file);
} else {
field_type += GenTypeName(field.value.type, false, true);
}
field_val = "this." + field_name + "()";
if (field.value.type.base_type != BASE_TYPE_STRING) {
field_offset_val = "this." + field_name;
} else {
field_offset_decl = GenNullCheckConditional(
"this." + field_name,
"builder.createString(this." + field_name + "!)", "0");
}
}
// Emit an object field
else {
auto is_vector = false;
switch (field.value.type.base_type) {
case BASE_TYPE_STRUCT: {
const auto &sd = *field.value.type.struct_def;
field_type += GenPrefixedTypeName(
WrapInNameSpace(sd.defined_namespace,
GetObjApiClassName(sd, parser.opts)),
field.value.type.struct_def->file);
const std::string field_accessor = "this." + field_name + "()";
field_val = GenNullCheckConditional(field_accessor,
field_accessor + "!.unpack()");
field_offset_val = GenNullCheckConditional(
"this." + field_name, "this." + field_name + "!.pack(builder)",
"0");
break;
}
case BASE_TYPE_VECTOR: {
auto vectortype = field.value.type.VectorType();
auto vectortypename = GenTypeName(vectortype, false);
is_vector = true;
field_type = "(";
switch (vectortype.base_type) {
case BASE_TYPE_STRUCT: {
const auto &sd = *field.value.type.struct_def;
field_type += GenPrefixedTypeName(
WrapInNameSpace(sd.defined_namespace,
GetObjApiClassName(sd, parser.opts)),
field.value.type.struct_def->file);
field_type += ")[]";
field_val = GenBBAccess() + ".createObjList(" +
field_binded_method + ", this." + field_name +
"Length())";
if (sd.fixed) {
field_offset_decl = "builder.createStructOffsetList(this." +
field_name + ", " + Verbose(struct_def) +
".start" + MakeCamel(field_name) +
"Vector)";
} else {
field_offset_decl =
Verbose(struct_def) + ".create" + MakeCamel(field_name) +
"Vector(builder, builder.createObjectOffsetList(" +
"this." + field_name + "))";
}
break;
}
case BASE_TYPE_STRING: {
field_type += "string)[]";
field_val = GenBBAccess() + ".createStringList(" +
field_binded_method + ", this." + field_name +
"Length())";
field_offset_decl =
Verbose(struct_def) + ".create" + MakeCamel(field_name) +
"Vector(builder, builder.createObjectOffsetList(" +
"this." + field_name + "))";
break;
}
case BASE_TYPE_UNION: {
field_type +=
GenObjApiUnionTypeTS(parser.opts, *(vectortype.enum_def));
field_type += ")[]";
field_val = GenUnionValTS(field_name, vectortype, true);
field_offset_decl =
Verbose(struct_def) + ".create" + MakeCamel(field_name) +
"Vector(builder, builder.createObjectOffsetList(" +
"this." + field_name + "))";
break;
}
default: {
if (vectortype.enum_def) {
field_type +=
GenPrefixedTypeName(GenTypeName(vectortype, false, true),
vectortype.enum_def->file);
} else {
field_type += vectortypename;
}
field_type += ")[]";
field_val = GenBBAccess() + ".createScalarList(" +
field_binded_method + ", this." + field_name +
"Length())";
field_offset_decl = Verbose(struct_def) + ".create" +
MakeCamel(field_name) +
"Vector(builder, this." + field_name + ")";
break;
}
}
break;
}
case BASE_TYPE_UNION: {
field_type +=
GenObjApiUnionTypeTS(parser.opts, *(field.value.type.enum_def));
field_val = GenUnionValTS(field_name, field.value.type);
field_offset_decl =
"builder.createObjectOffset(this." + field_name + ")";
break;
}
default: FLATBUFFERS_ASSERT(0); break;
}
// length 0 vector is simply empty instead of null
field_type += is_vector ? "" : "|null";
}
if (!field_offset_decl.empty()) {
field_offset_decl =
" const " + field_name + " = " + field_offset_decl + ";";
}
if (field_offset_val.empty()) { field_offset_val = field_name; }
unpack_func += " " + field_val;
unpack_to_func += " _o." + field_name + " = " + field_val + ";";
constructor_annotation +=
" * " + GenTypeAnnotation(kParam, field_type, field_name, false);
constructor_func += " public " + field_name + ": " + field_type + " = " +
field_default_val;
if (!struct_def.fixed) {
if (!field_offset_decl.empty()) {
pack_func_offset_decl += field_offset_decl + "\n";
}
pack_func_create_call += field_offset_val;
}
if (std::next(it) != struct_def.fields.vec.end()) {
constructor_annotation += "\n";
constructor_func += ",\n";
if (!struct_def.fixed) { pack_func_create_call += ",\n "; }
unpack_func += ",\n";
unpack_to_func += "\n";
} else {
constructor_func += "\n";
if (!struct_def.fixed) {
pack_func_offset_decl += (pack_func_offset_decl.empty() ? "" : "\n");
pack_func_create_call += "\n ";
}
unpack_func += "\n ";
unpack_to_func += "\n";
}
}
constructor_annotation += "\n */\n";
constructor_func += "){};\n\n";
pack_func_create_call += ");";
obj_api_class = "\nexport class " +
GetObjApiClassName(struct_def, parser.opts) + " {\n";
obj_api_class += constructor_annotation + constructor_func;
obj_api_class += pack_func_prototype + pack_func_offset_decl +
pack_func_create_call + "\n};";
obj_api_class += "\n}\n";
unpack_func += ");\n};";
unpack_to_func += "};\n";
obj_api_unpack_func = unpack_func + "\n\n" + unpack_to_func;
}
// Generate an accessor struct with constructor for a flatbuffers struct.
void GenStruct(const Parser &parser, StructDef &struct_def,
std::string *code_ptr, std::string *exports_ptr,
@@ -924,8 +1468,11 @@ class JsTsGenerator : public BaseGenerator {
if (is_union) { prefix += "<T extends flatbuffers.Table>"; }
prefix += "(index: number";
if (is_union) {
vectortypename = "T";
code += prefix + ", obj:T";
const auto union_type =
GenUnionGenericTypeTS(*(field.value.type.enum_def));
vectortypename = union_type;
code += prefix + ", obj:" + union_type;
} else if (vectortype.base_type == BASE_TYPE_STRUCT) {
vectortypename = GenPrefixedTypeName(
vectortypename, vectortype.struct_def->file);
@@ -1002,7 +1549,13 @@ class JsTsGenerator : public BaseGenerator {
false));
if (lang_.language == IDLOptions::kTs) {
code += MakeCamel(field.name, false);
code += "<T extends flatbuffers.Table>(obj:T):T|null {\n";
const auto &union_enum = *(field.value.type.enum_def);
const auto union_type = GenUnionGenericTypeTS(union_enum);
code += "<T extends flatbuffers.Table>(obj:" + union_type +
"):" + union_type +
"|null "
"{\n";
} else {
code +=
object_name + ".prototype." + MakeCamel(field.name, false);
@@ -1359,8 +1912,16 @@ class JsTsGenerator : public BaseGenerator {
}
if (lang_.language == IDLOptions::kTs) {
if (parser_.opts.generate_object_based_api) {
std::string obj_api_class;
std::string obj_api_unpack_func;
GenObjApi(parser_, struct_def, obj_api_unpack_func, obj_api_class);
code += obj_api_unpack_func + "}\n" + obj_api_class;
} else {
code += "}\n";
}
if (!object_namespace.empty()) { code += "}\n"; }
code += "}\n";
}
}
@@ -1381,7 +1942,7 @@ class JsTsGenerator : public BaseGenerator {
std::string Verbose(const StructDef &struct_def, const char *prefix = "") {
return parser_.opts.js_ts_short_names ? "" : prefix + struct_def.name;
}
};
}; // namespace jsts
} // namespace jsts
bool GenerateJSTS(const Parser &parser, const std::string &path,

View File

@@ -3,8 +3,12 @@ var assert = require('assert');
var fs = require('fs');
var flatbuffers = require('../js/flatbuffers').flatbuffers;
global.flatbuffers = flatbuffers;
var MyGame = require(process.argv[2]).MyGame;
var isTsTest = !!process.env.FB_TS_TEST;
function main() {
// First, let's test reading a FlatBuffer generated by C++ code:
@@ -24,6 +28,10 @@ function main() {
createMonster(fbb);
serializeAndTest(fbb);
if(isTsTest) {
testObjApiPack(fbb);
}
// clear the builder, repeat tests
var clearIterations = 100;
var startingCapacity = fbb.bb.capacity();
@@ -31,6 +39,10 @@ function main() {
fbb.clear();
createMonster(fbb);
serializeAndTest(fbb);
if(isTsTest) {
testObjApiPack(fbb);
}
}
// the capacity of our buffer shouldn't increase with the same size payload
assert.strictEqual(fbb.bb.capacity(), startingCapacity);
@@ -109,6 +121,56 @@ function testMutation(bb) {
// TODO: There is not the availability to mutate structs or vectors.
}
function testObjApiPack(fbb) {
fbb.clear();
createMonster(fbb);
let monster_t = MyGame.Example.Monster.getRootAsMonster(fbb.dataBuffer()).unpack();
fbb.clear();
MyGame.Example.Monster.finishMonsterBuffer(fbb, monster_t.pack(fbb));
serializeAndTest(fbb);
}
function testObjApiUnpack(monster) {
assert.strictEqual(monster.hp, 80);
assert.strictEqual(monster.mana, 150); // default
assert.strictEqual(monster.name, 'MyMonster');
let pos = monster.pos;
assert.strictEqual(pos.x, 1);
assert.strictEqual(pos.y, 2);
assert.strictEqual(pos.z, 3);
assert.strictEqual(pos.test1, 3);
assert.strictEqual(pos.test2, MyGame.Example.Color.Green);
let test3 = pos.test3;
assert.strictEqual(test3.a, 5);
assert.strictEqual(test3.b, 6);
assert.strictEqual(monster.testType, MyGame.Example.Any.Monster);
let monster2 = monster.test;
assert.strictEqual(monster2 != null, true);
assert.strictEqual(monster2 instanceof MyGame.Example.MonsterT, true);
assert.strictEqual(monster2.name, 'Fred');
assert.strictEqual(monster.inventory.length, 5);
let invsum = 0;
for (let i = 0; i < monster.inventory.length; i++) {
invsum += monster.inventory[i];
}
assert.strictEqual(invsum, 10);
let test_0 = monster.test4[0];
let test_1 = monster.test4[1];
assert.strictEqual(monster.test4.length, 2);
assert.strictEqual(test_0.a + test_0.b + test_1.a + test_1.b, 100);
assert.strictEqual(monster.testarrayofstring.length, 2);
assert.strictEqual(monster.testarrayofstring[0], 'test1');
assert.strictEqual(monster.testarrayofstring[1], 'test2');
assert.strictEqual(monster.testbool, true);
}
function testBuffer(bb) {
assert.ok(MyGame.Example.Monster.bufferHasIdentifier(bb));
@@ -158,6 +220,15 @@ function testBuffer(bb) {
assert.strictEqual(monster.testarrayofstring(1), 'test2');
assert.strictEqual(monster.testbool(), true);
if(isTsTest) {
let monster_t = monster.unpack();
testObjApiUnpack(monster_t);
let monster2_t = new MyGame.Example.MonsterT();
monster.unpackTo(monster2_t);
testObjApiUnpack(monster2_t);
}
}
function test64bit() {

View File

@@ -16,4 +16,8 @@
pushd "$(dirname $0)" >/dev/null
../flatc -b -I include_test monster_test.fbs unicode_test.json
node JavaScriptTest ./monster_test_generated
../flatc --js -o js --gen-mutable --no-fb-import -I include_test monster_test.fbs
node JavaScriptTest ./js/monster_test_generated
../flatc --js -o js --no-fb-import union_vector/union_vector.fbs
node JavaScriptUnionVectorTest ./js/union_vector_generated

View File

@@ -3,38 +3,16 @@ var assert = require('assert');
var flatbuffers = require('../js/flatbuffers').flatbuffers;
var Test = require(process.argv[2]);
function main() {
var fbb = new flatbuffers.Builder();
var isTsTest = !!process.env.FB_TS_TEST;
var charTypes = [
Test.Character.Belle,
Test.Character.MuLan,
Test.Character.BookFan,
];
Test.Attacker.startAttacker(fbb);
Test.Attacker.addSwordAttackDamage(fbb, 5);
var attackerOffset = Test.Attacker.endAttacker(fbb);
var charTypesOffset = Test.Movie.createCharactersTypeVector(fbb, charTypes);
var charsOffset = Test.Movie.createCharactersVector(
fbb,
[
Test.BookReader.createBookReader(fbb, 7),
attackerOffset,
Test.BookReader.createBookReader(fbb, 2),
]
);
Test.Movie.startMovie(fbb);
Test.Movie.addCharactersType(fbb, charTypesOffset);
Test.Movie.addCharacters(fbb, charsOffset);
Test.Movie.finishMovieBuffer(fbb, Test.Movie.endMovie(fbb));
var buf = new flatbuffers.ByteBuffer(fbb.asUint8Array());
var movie = Test.Movie.getRootAsMovie(buf);
var charTypes = [
Test.Character.Belle,
Test.Character.MuLan,
Test.Character.BookFan,
];
if(isTsTest) { charTypes.push(Test.Character.Other); }
function testMovieBuf(movie) {
assert.strictEqual(movie.charactersTypeLength(), charTypes.length);
assert.strictEqual(movie.charactersLength(), movie.charactersTypeLength());
@@ -51,6 +29,98 @@ function main() {
var bookReader2 = movie.characters(2, new Test.BookReader());
assert.strictEqual(bookReader2.booksRead(), 2);
if(isTsTest) {
var other = movie.characters(3, '');
assert.strictEqual(other, "I am other");
}
}
function testMovieUnpack(movie) {
assert.strictEqual(movie.charactersType.length, charTypes.length);
assert.strictEqual(movie.characters.length, movie.charactersType.length);
for (var i = 0; i < charTypes.length; ++i) {
assert.strictEqual(movie.charactersType[i], charTypes[i]);
}
var bookReader7 = movie.characters[0];
assert.strictEqual(bookReader7 instanceof Test.BookReaderT, true);
assert.strictEqual(bookReader7.booksRead, 7);
var attacker = movie.characters[1];
assert.strictEqual(attacker instanceof Test.AttackerT, true);
assert.strictEqual(attacker.swordAttackDamage, 5);
var bookReader2 = movie.characters[2];
assert.strictEqual(bookReader2 instanceof Test.BookReaderT, true);
assert.strictEqual(bookReader2.booksRead, 2);
if(isTsTest) {
var other = movie.characters[3];
assert.strictEqual(other, "I am other");
}
}
function createMovie(fbb) {
Test.Attacker.startAttacker(fbb);
Test.Attacker.addSwordAttackDamage(fbb, 5);
var attackerOffset = Test.Attacker.endAttacker(fbb);
var charTypesOffset = Test.Movie.createCharactersTypeVector(fbb, charTypes);
var charsOffset = 0;
if(isTsTest) {
let otherOffset = fbb.createString("I am other");
charsOffset = Test.Movie.createCharactersVector(
fbb,
[
Test.BookReader.createBookReader(fbb, 7),
attackerOffset,
Test.BookReader.createBookReader(fbb, 2),
otherOffset
]
);
} else {
charsOffset = Test.Movie.createCharactersVector(
fbb,
[
Test.BookReader.createBookReader(fbb, 7),
attackerOffset,
Test.BookReader.createBookReader(fbb, 2)
]
);
}
Test.Movie.startMovie(fbb);
Test.Movie.addCharactersType(fbb, charTypesOffset);
Test.Movie.addCharacters(fbb, charsOffset);
Test.Movie.finishMovieBuffer(fbb, Test.Movie.endMovie(fbb))
}
function main() {
var fbb = new flatbuffers.Builder();
createMovie(fbb);
var buf = new flatbuffers.ByteBuffer(fbb.asUint8Array());
var movie = Test.Movie.getRootAsMovie(buf);
testMovieBuf(movie);
if(isTsTest) {
testMovieUnpack(movie.unpack());
var movie_to = new Test.MovieT();
movie.unpackTo(movie_to);
testMovieUnpack(movie_to);
fbb.clear();
Test.Movie.finishMovieBuffer(fbb, movie_to.pack(fbb));
var unpackBuf = new flatbuffers.ByteBuffer(fbb.asUint8Array());
testMovieBuf(Test.Movie.getRootAsMovie(unpackBuf));
}
console.log('FlatBuffers union vector test: completed successfully');
}

View File

@@ -18,16 +18,17 @@ pushd "$(dirname $0)" >/dev/null
npm install @types/flatbuffers
../flatc --ts --no-fb-import --gen-mutable -o ts -I include_test monster_test.fbs
../flatc -b -I include_test monster_test.fbs unicode_test.json
export FB_TS_TEST="TRUE"
../flatc --ts --no-fb-import --gen-mutable --gen-object-api -o ts -I include_test monster_test.fbs
../flatc --gen-object-api -b -I include_test monster_test.fbs unicode_test.json
tsc --strict --noUnusedParameters --noUnusedLocals --noImplicitReturns --strictNullChecks ts/monster_test_generated.ts
node JavaScriptTest ./ts/monster_test_generated
../flatc --ts --js --no-fb-import -o ts union_vector/union_vector.fbs
# test JS version first, then transpile and rerun for TS
node JavaScriptUnionVectorTest ./ts/union_vector_generated
../flatc --ts --no-fb-import --gen-object-api -o ts union_vector/union_vector.fbs
tsc --strict --noUnusedParameters --noUnusedLocals --noImplicitReturns --strictNullChecks ts/union_vector_generated.ts
node JavaScriptUnionVectorTest ./ts/union_vector_generated
unset FB_TS_TEST
npm uninstall @types/flatbuffers

View File

@@ -19,7 +19,8 @@ export enum Color{
* \brief color Blue (1u << 3)
*/
Blue= 8
}};
};
}
/**
* @enum {number}
@@ -30,7 +31,8 @@ export enum Race{
Human= 0,
Dwarf= 1,
Elf= 2
}};
};
}
/**
* @enum {number}
@@ -41,7 +43,35 @@ export enum Any{
Monster= 1,
TestSimpleTableWithEnum= 2,
MyGame_Example2_Monster= 3
}};
};
export function unionToAny(
type: Any,
accessor: (obj:MyGame.Example.Monster|MyGame.Example.TestSimpleTableWithEnum|MyGame.Example2.Monster) => MyGame.Example.Monster|MyGame.Example.TestSimpleTableWithEnum|MyGame.Example2.Monster|null
): MyGame.Example.Monster|MyGame.Example.TestSimpleTableWithEnum|MyGame.Example2.Monster|null {
switch(MyGame.Example.Any[type]) {
case 'NONE': return null;
case 'Monster': return accessor(new MyGame.Example.Monster())! as MyGame.Example.Monster;
case 'TestSimpleTableWithEnum': return accessor(new MyGame.Example.TestSimpleTableWithEnum())! as MyGame.Example.TestSimpleTableWithEnum;
case 'MyGame_Example2_Monster': return accessor(new MyGame.Example2.Monster())! as MyGame.Example2.Monster;
default: return null;
}
}
export function unionListToAny(
type: Any,
accessor: (index: number, obj:MyGame.Example.Monster|MyGame.Example.TestSimpleTableWithEnum|MyGame.Example2.Monster) => MyGame.Example.Monster|MyGame.Example.TestSimpleTableWithEnum|MyGame.Example2.Monster|null,
index: number
): MyGame.Example.Monster|MyGame.Example.TestSimpleTableWithEnum|MyGame.Example2.Monster|null {
switch(MyGame.Example.Any[type]) {
case 'NONE': return null;
case 'Monster': return accessor(index, new MyGame.Example.Monster())! as MyGame.Example.Monster;
case 'TestSimpleTableWithEnum': return accessor(index, new MyGame.Example.TestSimpleTableWithEnum())! as MyGame.Example.TestSimpleTableWithEnum;
case 'MyGame_Example2_Monster': return accessor(index, new MyGame.Example2.Monster())! as MyGame.Example2.Monster;
default: return null;
}
}
}
/**
* @enum {number}
@@ -52,7 +82,35 @@ export enum AnyUniqueAliases{
M= 1,
TS= 2,
M2= 3
}};
};
export function unionToAnyUniqueAliases(
type: AnyUniqueAliases,
accessor: (obj:MyGame.Example.Monster|MyGame.Example.TestSimpleTableWithEnum|MyGame.Example2.Monster) => MyGame.Example.Monster|MyGame.Example.TestSimpleTableWithEnum|MyGame.Example2.Monster|null
): MyGame.Example.Monster|MyGame.Example.TestSimpleTableWithEnum|MyGame.Example2.Monster|null {
switch(MyGame.Example.AnyUniqueAliases[type]) {
case 'NONE': return null;
case 'M': return accessor(new MyGame.Example.Monster())! as MyGame.Example.Monster;
case 'TS': return accessor(new MyGame.Example.TestSimpleTableWithEnum())! as MyGame.Example.TestSimpleTableWithEnum;
case 'M2': return accessor(new MyGame.Example2.Monster())! as MyGame.Example2.Monster;
default: return null;
}
}
export function unionListToAnyUniqueAliases(
type: AnyUniqueAliases,
accessor: (index: number, obj:MyGame.Example.Monster|MyGame.Example.TestSimpleTableWithEnum|MyGame.Example2.Monster) => MyGame.Example.Monster|MyGame.Example.TestSimpleTableWithEnum|MyGame.Example2.Monster|null,
index: number
): MyGame.Example.Monster|MyGame.Example.TestSimpleTableWithEnum|MyGame.Example2.Monster|null {
switch(MyGame.Example.AnyUniqueAliases[type]) {
case 'NONE': return null;
case 'M': return accessor(index, new MyGame.Example.Monster())! as MyGame.Example.Monster;
case 'TS': return accessor(index, new MyGame.Example.TestSimpleTableWithEnum())! as MyGame.Example.TestSimpleTableWithEnum;
case 'M2': return accessor(index, new MyGame.Example2.Monster())! as MyGame.Example2.Monster;
default: return null;
}
}
}
/**
* @enum {number}
@@ -63,7 +121,35 @@ export enum AnyAmbiguousAliases{
M1= 1,
M2= 2,
M3= 3
}};
};
export function unionToAnyAmbiguousAliases(
type: AnyAmbiguousAliases,
accessor: (obj:MyGame.Example.Monster) => MyGame.Example.Monster|null
): MyGame.Example.Monster|null {
switch(MyGame.Example.AnyAmbiguousAliases[type]) {
case 'NONE': return null;
case 'M1': return accessor(new MyGame.Example.Monster())! as MyGame.Example.Monster;
case 'M2': return accessor(new MyGame.Example.Monster())! as MyGame.Example.Monster;
case 'M3': return accessor(new MyGame.Example.Monster())! as MyGame.Example.Monster;
default: return null;
}
}
export function unionListToAnyAmbiguousAliases(
type: AnyAmbiguousAliases,
accessor: (index: number, obj:MyGame.Example.Monster) => MyGame.Example.Monster|null,
index: number
): MyGame.Example.Monster|null {
switch(MyGame.Example.AnyAmbiguousAliases[type]) {
case 'NONE': return null;
case 'M1': return accessor(index, new MyGame.Example.Monster())! as MyGame.Example.Monster;
case 'M2': return accessor(index, new MyGame.Example.Monster())! as MyGame.Example.Monster;
case 'M3': return accessor(index, new MyGame.Example.Monster())! as MyGame.Example.Monster;
default: return null;
}
}
}
/**
* @constructor
@@ -123,6 +209,33 @@ static createInParentNamespace(builder:flatbuffers.Builder):flatbuffers.Offset {
InParentNamespace.startInParentNamespace(builder);
return InParentNamespace.endInParentNamespace(builder);
}
/**
* @returns InParentNamespaceT
*/
unpack(): InParentNamespaceT {
return new InParentNamespaceT();
};
/**
* @param InParentNamespaceT _o
*/
unpackTo(_o: InParentNamespaceT): void {};
}
export class InParentNamespaceT {
/**
* @constructor
*/
constructor(){};
/**
* @param flatbuffers.Builder builder
* @returns flatbuffers.Offset
*/
pack(builder:flatbuffers.Builder): flatbuffers.Offset {
return InParentNamespace.createInParentNamespace(builder);
};
}
}
/**
@@ -183,6 +296,33 @@ static createMonster(builder:flatbuffers.Builder):flatbuffers.Offset {
Monster.startMonster(builder);
return Monster.endMonster(builder);
}
/**
* @returns MonsterT
*/
unpack(): MonsterT {
return new MonsterT();
};
/**
* @param MonsterT _o
*/
unpackTo(_o: MonsterT): void {};
}
export class MonsterT {
/**
* @constructor
*/
constructor(){};
/**
* @param flatbuffers.Builder builder
* @returns flatbuffers.Offset
*/
pack(builder:flatbuffers.Builder): flatbuffers.Offset {
return Monster.createMonster(builder);
};
}
}
/**
@@ -262,6 +402,47 @@ static createTest(builder:flatbuffers.Builder, a: number, b: number):flatbuffers
return builder.offset();
};
/**
* @returns TestT
*/
unpack(): TestT {
return new TestT(
this.a(),
this.b()
);
};
/**
* @param TestT _o
*/
unpackTo(_o: TestT): void {
_o.a = this.a();
_o.b = this.b();
};
}
export class TestT {
/**
* @constructor
* @param number a
* @param number b
*/
constructor(
public a: number = 0,
public b: number = 0
){};
/**
* @param flatbuffers.Builder builder
* @returns flatbuffers.Offset
*/
pack(builder:flatbuffers.Builder): flatbuffers.Offset {
return Test.createTest(builder,
this.a,
this.b
);
};
}
}
/**
@@ -354,6 +535,42 @@ static createTestSimpleTableWithEnum(builder:flatbuffers.Builder, color:MyGame.E
TestSimpleTableWithEnum.addColor(builder, color);
return TestSimpleTableWithEnum.endTestSimpleTableWithEnum(builder);
}
/**
* @returns TestSimpleTableWithEnumT
*/
unpack(): TestSimpleTableWithEnumT {
return new TestSimpleTableWithEnumT(
this.color()
);
};
/**
* @param TestSimpleTableWithEnumT _o
*/
unpackTo(_o: TestSimpleTableWithEnumT): void {
_o.color = this.color();
};
}
export class TestSimpleTableWithEnumT {
/**
* @constructor
* @param MyGame.Example.Color color
*/
constructor(
public color: MyGame.Example.Color = MyGame.Example.Color.Green
){};
/**
* @param flatbuffers.Builder builder
* @returns flatbuffers.Offset
*/
pack(builder:flatbuffers.Builder): flatbuffers.Offset {
return TestSimpleTableWithEnum.createTestSimpleTableWithEnum(builder,
this.color
);
};
}
}
/**
@@ -521,6 +738,68 @@ static createVec3(builder:flatbuffers.Builder, x: number, y: number, z: number,
return builder.offset();
};
/**
* @returns Vec3T
*/
unpack(): Vec3T {
return new Vec3T(
this.x(),
this.y(),
this.z(),
this.test1(),
this.test2(),
(this.test3() !== null ? this.test3()!.unpack() : null)
);
};
/**
* @param Vec3T _o
*/
unpackTo(_o: Vec3T): void {
_o.x = this.x();
_o.y = this.y();
_o.z = this.z();
_o.test1 = this.test1();
_o.test2 = this.test2();
_o.test3 = (this.test3() !== null ? this.test3()!.unpack() : null);
};
}
export class Vec3T {
/**
* @constructor
* @param number x
* @param number y
* @param number z
* @param number test1
* @param MyGame.Example.Color test2
* @param MyGame.Example.TestT|null test3
*/
constructor(
public x: number = 0.0,
public y: number = 0.0,
public z: number = 0.0,
public test1: number = 0.0,
public test2: MyGame.Example.Color = /** } */ (0),
public test3: MyGame.Example.TestT|null = null
){};
/**
* @param flatbuffers.Builder builder
* @returns flatbuffers.Offset
*/
pack(builder:flatbuffers.Builder): flatbuffers.Offset {
return Vec3.createVec3(builder,
this.x,
this.y,
this.z,
this.test1,
this.test2,
(this.test3 === null ? 0 : this.test3.a!),
(this.test3 === null ? 0 : this.test3.b!)
);
};
}
}
/**
@@ -599,6 +878,47 @@ static createAbility(builder:flatbuffers.Builder, id: number, distance: number):
return builder.offset();
};
/**
* @returns AbilityT
*/
unpack(): AbilityT {
return new AbilityT(
this.id(),
this.distance()
);
};
/**
* @param AbilityT _o
*/
unpackTo(_o: AbilityT): void {
_o.id = this.id();
_o.distance = this.distance();
};
}
export class AbilityT {
/**
* @constructor
* @param number id
* @param number distance
*/
constructor(
public id: number = 0,
public distance: number = 0
){};
/**
* @param flatbuffers.Builder builder
* @returns flatbuffers.Offset
*/
pack(builder:flatbuffers.Builder): flatbuffers.Offset {
return Ability.createAbility(builder,
this.id,
this.distance
);
};
}
}
/**
@@ -743,6 +1063,54 @@ static createStat(builder:flatbuffers.Builder, idOffset:flatbuffers.Offset, val:
Stat.addCount(builder, count);
return Stat.endStat(builder);
}
/**
* @returns StatT
*/
unpack(): StatT {
return new StatT(
this.id(),
this.val(),
this.count()
);
};
/**
* @param StatT _o
*/
unpackTo(_o: StatT): void {
_o.id = this.id();
_o.val = this.val();
_o.count = this.count();
};
}
export class StatT {
/**
* @constructor
* @param string|Uint8Array|null id
* @param flatbuffers.Long val
* @param number count
*/
constructor(
public id: string|Uint8Array|null = null,
public val: flatbuffers.Long = flatbuffers.createLong(0, 0),
public count: number = 0
){};
/**
* @param flatbuffers.Builder builder
* @returns flatbuffers.Offset
*/
pack(builder:flatbuffers.Builder): flatbuffers.Offset {
const id = (this.id !== null ? builder.createString(this.id!) : 0);
return Stat.createStat(builder,
id,
this.val,
this.count
);
};
}
}
/**
@@ -835,6 +1203,42 @@ static createReferrable(builder:flatbuffers.Builder, id:flatbuffers.Long):flatbu
Referrable.addId(builder, id);
return Referrable.endReferrable(builder);
}
/**
* @returns ReferrableT
*/
unpack(): ReferrableT {
return new ReferrableT(
this.id()
);
};
/**
* @param ReferrableT _o
*/
unpackTo(_o: ReferrableT): void {
_o.id = this.id();
};
}
export class ReferrableT {
/**
* @constructor
* @param flatbuffers.Long id
*/
constructor(
public id: flatbuffers.Long = flatbuffers.createLong(0, 0)
){};
/**
* @param flatbuffers.Builder builder
* @returns flatbuffers.Offset
*/
pack(builder:flatbuffers.Builder): flatbuffers.Offset {
return Referrable.createReferrable(builder,
this.id
);
};
}
}
/**
@@ -2597,6 +3001,324 @@ static createMonster(builder:flatbuffers.Builder, posOffset:flatbuffers.Offset,
Monster.addSignedEnum(builder, signedEnum);
return Monster.endMonster(builder);
}
/**
* @returns MonsterT
*/
unpack(): MonsterT {
return new MonsterT(
(this.pos() !== null ? this.pos()!.unpack() : null),
this.mana(),
this.hp(),
this.name(),
this.bb!.createScalarList(this.inventory.bind(this), this.inventoryLength()),
this.color(),
this.testType(),
(() => {
let temp = MyGame.Example.unionToAny(this.testType(), this.test.bind(this));
if(temp === null) { return null; }
return temp.unpack()
})(),
this.bb!.createObjList(this.test4.bind(this), this.test4Length()),
this.bb!.createStringList(this.testarrayofstring.bind(this), this.testarrayofstringLength()),
this.bb!.createObjList(this.testarrayoftables.bind(this), this.testarrayoftablesLength()),
(this.enemy() !== null ? this.enemy()!.unpack() : null),
this.bb!.createScalarList(this.testnestedflatbuffer.bind(this), this.testnestedflatbufferLength()),
(this.testempty() !== null ? this.testempty()!.unpack() : null),
this.testbool(),
this.testhashs32Fnv1(),
this.testhashu32Fnv1(),
this.testhashs64Fnv1(),
this.testhashu64Fnv1(),
this.testhashs32Fnv1a(),
this.testhashu32Fnv1a(),
this.testhashs64Fnv1a(),
this.testhashu64Fnv1a(),
this.bb!.createScalarList(this.testarrayofbools.bind(this), this.testarrayofboolsLength()),
this.testf(),
this.testf2(),
this.testf3(),
this.bb!.createStringList(this.testarrayofstring2.bind(this), this.testarrayofstring2Length()),
this.bb!.createObjList(this.testarrayofsortedstruct.bind(this), this.testarrayofsortedstructLength()),
this.bb!.createScalarList(this.flex.bind(this), this.flexLength()),
this.bb!.createObjList(this.test5.bind(this), this.test5Length()),
this.bb!.createScalarList(this.vectorOfLongs.bind(this), this.vectorOfLongsLength()),
this.bb!.createScalarList(this.vectorOfDoubles.bind(this), this.vectorOfDoublesLength()),
(this.parentNamespaceTest() !== null ? this.parentNamespaceTest()!.unpack() : null),
this.bb!.createObjList(this.vectorOfReferrables.bind(this), this.vectorOfReferrablesLength()),
this.singleWeakReference(),
this.bb!.createScalarList(this.vectorOfWeakReferences.bind(this), this.vectorOfWeakReferencesLength()),
this.bb!.createObjList(this.vectorOfStrongReferrables.bind(this), this.vectorOfStrongReferrablesLength()),
this.coOwningReference(),
this.bb!.createScalarList(this.vectorOfCoOwningReferences.bind(this), this.vectorOfCoOwningReferencesLength()),
this.nonOwningReference(),
this.bb!.createScalarList(this.vectorOfNonOwningReferences.bind(this), this.vectorOfNonOwningReferencesLength()),
this.anyUniqueType(),
(() => {
let temp = MyGame.Example.unionToAnyUniqueAliases(this.anyUniqueType(), this.anyUnique.bind(this));
if(temp === null) { return null; }
return temp.unpack()
})(),
this.anyAmbiguousType(),
(() => {
let temp = MyGame.Example.unionToAnyAmbiguousAliases(this.anyAmbiguousType(), this.anyAmbiguous.bind(this));
if(temp === null) { return null; }
return temp.unpack()
})(),
this.bb!.createScalarList(this.vectorOfEnums.bind(this), this.vectorOfEnumsLength()),
this.signedEnum()
);
};
/**
* @param MonsterT _o
*/
unpackTo(_o: MonsterT): void {
_o.pos = (this.pos() !== null ? this.pos()!.unpack() : null);
_o.mana = this.mana();
_o.hp = this.hp();
_o.name = this.name();
_o.inventory = this.bb!.createScalarList(this.inventory.bind(this), this.inventoryLength());
_o.color = this.color();
_o.testType = this.testType();
_o.test = (() => {
let temp = MyGame.Example.unionToAny(this.testType(), this.test.bind(this));
if(temp === null) { return null; }
return temp.unpack()
})();
_o.test4 = this.bb!.createObjList(this.test4.bind(this), this.test4Length());
_o.testarrayofstring = this.bb!.createStringList(this.testarrayofstring.bind(this), this.testarrayofstringLength());
_o.testarrayoftables = this.bb!.createObjList(this.testarrayoftables.bind(this), this.testarrayoftablesLength());
_o.enemy = (this.enemy() !== null ? this.enemy()!.unpack() : null);
_o.testnestedflatbuffer = this.bb!.createScalarList(this.testnestedflatbuffer.bind(this), this.testnestedflatbufferLength());
_o.testempty = (this.testempty() !== null ? this.testempty()!.unpack() : null);
_o.testbool = this.testbool();
_o.testhashs32Fnv1 = this.testhashs32Fnv1();
_o.testhashu32Fnv1 = this.testhashu32Fnv1();
_o.testhashs64Fnv1 = this.testhashs64Fnv1();
_o.testhashu64Fnv1 = this.testhashu64Fnv1();
_o.testhashs32Fnv1a = this.testhashs32Fnv1a();
_o.testhashu32Fnv1a = this.testhashu32Fnv1a();
_o.testhashs64Fnv1a = this.testhashs64Fnv1a();
_o.testhashu64Fnv1a = this.testhashu64Fnv1a();
_o.testarrayofbools = this.bb!.createScalarList(this.testarrayofbools.bind(this), this.testarrayofboolsLength());
_o.testf = this.testf();
_o.testf2 = this.testf2();
_o.testf3 = this.testf3();
_o.testarrayofstring2 = this.bb!.createStringList(this.testarrayofstring2.bind(this), this.testarrayofstring2Length());
_o.testarrayofsortedstruct = this.bb!.createObjList(this.testarrayofsortedstruct.bind(this), this.testarrayofsortedstructLength());
_o.flex = this.bb!.createScalarList(this.flex.bind(this), this.flexLength());
_o.test5 = this.bb!.createObjList(this.test5.bind(this), this.test5Length());
_o.vectorOfLongs = this.bb!.createScalarList(this.vectorOfLongs.bind(this), this.vectorOfLongsLength());
_o.vectorOfDoubles = this.bb!.createScalarList(this.vectorOfDoubles.bind(this), this.vectorOfDoublesLength());
_o.parentNamespaceTest = (this.parentNamespaceTest() !== null ? this.parentNamespaceTest()!.unpack() : null);
_o.vectorOfReferrables = this.bb!.createObjList(this.vectorOfReferrables.bind(this), this.vectorOfReferrablesLength());
_o.singleWeakReference = this.singleWeakReference();
_o.vectorOfWeakReferences = this.bb!.createScalarList(this.vectorOfWeakReferences.bind(this), this.vectorOfWeakReferencesLength());
_o.vectorOfStrongReferrables = this.bb!.createObjList(this.vectorOfStrongReferrables.bind(this), this.vectorOfStrongReferrablesLength());
_o.coOwningReference = this.coOwningReference();
_o.vectorOfCoOwningReferences = this.bb!.createScalarList(this.vectorOfCoOwningReferences.bind(this), this.vectorOfCoOwningReferencesLength());
_o.nonOwningReference = this.nonOwningReference();
_o.vectorOfNonOwningReferences = this.bb!.createScalarList(this.vectorOfNonOwningReferences.bind(this), this.vectorOfNonOwningReferencesLength());
_o.anyUniqueType = this.anyUniqueType();
_o.anyUnique = (() => {
let temp = MyGame.Example.unionToAnyUniqueAliases(this.anyUniqueType(), this.anyUnique.bind(this));
if(temp === null) { return null; }
return temp.unpack()
})();
_o.anyAmbiguousType = this.anyAmbiguousType();
_o.anyAmbiguous = (() => {
let temp = MyGame.Example.unionToAnyAmbiguousAliases(this.anyAmbiguousType(), this.anyAmbiguous.bind(this));
if(temp === null) { return null; }
return temp.unpack()
})();
_o.vectorOfEnums = this.bb!.createScalarList(this.vectorOfEnums.bind(this), this.vectorOfEnumsLength());
_o.signedEnum = this.signedEnum();
};
}
export class MonsterT {
/**
* @constructor
* @param MyGame.Example.Vec3T|null pos
* @param number mana
* @param number hp
* @param string|Uint8Array|null name
* @param (number)[] inventory
* @param MyGame.Example.Color color
* @param MyGame.Example.Any testType
* @param MyGame.Example.MonsterT|MyGame.Example.TestSimpleTableWithEnumT|MyGame.Example2.MonsterT|null test
* @param (MyGame.Example.TestT)[] test4
* @param (string)[] testarrayofstring
* @param (MyGame.Example.MonsterT)[] testarrayoftables
* @param MyGame.Example.MonsterT|null enemy
* @param (number)[] testnestedflatbuffer
* @param MyGame.Example.StatT|null testempty
* @param boolean testbool
* @param number testhashs32Fnv1
* @param number testhashu32Fnv1
* @param flatbuffers.Long testhashs64Fnv1
* @param flatbuffers.Long testhashu64Fnv1
* @param number testhashs32Fnv1a
* @param number testhashu32Fnv1a
* @param flatbuffers.Long testhashs64Fnv1a
* @param flatbuffers.Long testhashu64Fnv1a
* @param (boolean)[] testarrayofbools
* @param number testf
* @param number testf2
* @param number testf3
* @param (string)[] testarrayofstring2
* @param (MyGame.Example.AbilityT)[] testarrayofsortedstruct
* @param (number)[] flex
* @param (MyGame.Example.TestT)[] test5
* @param (flatbuffers.Long)[] vectorOfLongs
* @param (number)[] vectorOfDoubles
* @param MyGame.InParentNamespaceT|null parentNamespaceTest
* @param (MyGame.Example.ReferrableT)[] vectorOfReferrables
* @param flatbuffers.Long singleWeakReference
* @param (flatbuffers.Long)[] vectorOfWeakReferences
* @param (MyGame.Example.ReferrableT)[] vectorOfStrongReferrables
* @param flatbuffers.Long coOwningReference
* @param (flatbuffers.Long)[] vectorOfCoOwningReferences
* @param flatbuffers.Long nonOwningReference
* @param (flatbuffers.Long)[] vectorOfNonOwningReferences
* @param MyGame.Example.AnyUniqueAliases anyUniqueType
* @param MyGame.Example.MonsterT|MyGame.Example.TestSimpleTableWithEnumT|MyGame.Example2.MonsterT|null anyUnique
* @param MyGame.Example.AnyAmbiguousAliases anyAmbiguousType
* @param MyGame.Example.MonsterT|null anyAmbiguous
* @param (MyGame.Example.Color)[] vectorOfEnums
* @param MyGame.Example.Race signedEnum
*/
constructor(
public pos: MyGame.Example.Vec3T|null = null,
public mana: number = 150,
public hp: number = 100,
public name: string|Uint8Array|null = null,
public inventory: (number)[] = [],
public color: MyGame.Example.Color = MyGame.Example.Color.Blue,
public testType: MyGame.Example.Any = MyGame.Example.Any.NONE,
public test: MyGame.Example.MonsterT|MyGame.Example.TestSimpleTableWithEnumT|MyGame.Example2.MonsterT|null = null,
public test4: (MyGame.Example.TestT)[] = [],
public testarrayofstring: (string)[] = [],
public testarrayoftables: (MyGame.Example.MonsterT)[] = [],
public enemy: MyGame.Example.MonsterT|null = null,
public testnestedflatbuffer: (number)[] = [],
public testempty: MyGame.Example.StatT|null = null,
public testbool: boolean = false,
public testhashs32Fnv1: number = 0,
public testhashu32Fnv1: number = 0,
public testhashs64Fnv1: flatbuffers.Long = flatbuffers.createLong(0, 0),
public testhashu64Fnv1: flatbuffers.Long = flatbuffers.createLong(0, 0),
public testhashs32Fnv1a: number = 0,
public testhashu32Fnv1a: number = 0,
public testhashs64Fnv1a: flatbuffers.Long = flatbuffers.createLong(0, 0),
public testhashu64Fnv1a: flatbuffers.Long = flatbuffers.createLong(0, 0),
public testarrayofbools: (boolean)[] = [],
public testf: number = 3.14159,
public testf2: number = 3.0,
public testf3: number = 0.0,
public testarrayofstring2: (string)[] = [],
public testarrayofsortedstruct: (MyGame.Example.AbilityT)[] = [],
public flex: (number)[] = [],
public test5: (MyGame.Example.TestT)[] = [],
public vectorOfLongs: (flatbuffers.Long)[] = [],
public vectorOfDoubles: (number)[] = [],
public parentNamespaceTest: MyGame.InParentNamespaceT|null = null,
public vectorOfReferrables: (MyGame.Example.ReferrableT)[] = [],
public singleWeakReference: flatbuffers.Long = flatbuffers.createLong(0, 0),
public vectorOfWeakReferences: (flatbuffers.Long)[] = [],
public vectorOfStrongReferrables: (MyGame.Example.ReferrableT)[] = [],
public coOwningReference: flatbuffers.Long = flatbuffers.createLong(0, 0),
public vectorOfCoOwningReferences: (flatbuffers.Long)[] = [],
public nonOwningReference: flatbuffers.Long = flatbuffers.createLong(0, 0),
public vectorOfNonOwningReferences: (flatbuffers.Long)[] = [],
public anyUniqueType: MyGame.Example.AnyUniqueAliases = MyGame.Example.AnyUniqueAliases.NONE,
public anyUnique: MyGame.Example.MonsterT|MyGame.Example.TestSimpleTableWithEnumT|MyGame.Example2.MonsterT|null = null,
public anyAmbiguousType: MyGame.Example.AnyAmbiguousAliases = MyGame.Example.AnyAmbiguousAliases.NONE,
public anyAmbiguous: MyGame.Example.MonsterT|null = null,
public vectorOfEnums: (MyGame.Example.Color)[] = [],
public signedEnum: MyGame.Example.Race = MyGame.Example.Race.None
){};
/**
* @param flatbuffers.Builder builder
* @returns flatbuffers.Offset
*/
pack(builder:flatbuffers.Builder): flatbuffers.Offset {
const name = (this.name !== null ? builder.createString(this.name!) : 0);
const inventory = Monster.createInventoryVector(builder, this.inventory);
const test = builder.createObjectOffset(this.test);
const test4 = builder.createStructOffsetList(this.test4, Monster.startTest4Vector);
const testarrayofstring = Monster.createTestarrayofstringVector(builder, builder.createObjectOffsetList(this.testarrayofstring));
const testarrayoftables = Monster.createTestarrayoftablesVector(builder, builder.createObjectOffsetList(this.testarrayoftables));
const testnestedflatbuffer = Monster.createTestnestedflatbufferVector(builder, this.testnestedflatbuffer);
const testarrayofbools = Monster.createTestarrayofboolsVector(builder, this.testarrayofbools);
const testarrayofstring2 = Monster.createTestarrayofstring2Vector(builder, builder.createObjectOffsetList(this.testarrayofstring2));
const testarrayofsortedstruct = builder.createStructOffsetList(this.testarrayofsortedstruct, Monster.startTestarrayofsortedstructVector);
const flex = Monster.createFlexVector(builder, this.flex);
const test5 = builder.createStructOffsetList(this.test5, Monster.startTest5Vector);
const vectorOfLongs = Monster.createVectorOfLongsVector(builder, this.vectorOfLongs);
const vectorOfDoubles = Monster.createVectorOfDoublesVector(builder, this.vectorOfDoubles);
const vectorOfReferrables = Monster.createVectorOfReferrablesVector(builder, builder.createObjectOffsetList(this.vectorOfReferrables));
const vectorOfWeakReferences = Monster.createVectorOfWeakReferencesVector(builder, this.vectorOfWeakReferences);
const vectorOfStrongReferrables = Monster.createVectorOfStrongReferrablesVector(builder, builder.createObjectOffsetList(this.vectorOfStrongReferrables));
const vectorOfCoOwningReferences = Monster.createVectorOfCoOwningReferencesVector(builder, this.vectorOfCoOwningReferences);
const vectorOfNonOwningReferences = Monster.createVectorOfNonOwningReferencesVector(builder, this.vectorOfNonOwningReferences);
const anyUnique = builder.createObjectOffset(this.anyUnique);
const anyAmbiguous = builder.createObjectOffset(this.anyAmbiguous);
const vectorOfEnums = Monster.createVectorOfEnumsVector(builder, this.vectorOfEnums);
return Monster.createMonster(builder,
(this.pos !== null ? this.pos!.pack(builder) : 0),
this.mana,
this.hp,
name,
inventory,
this.color,
this.testType,
test,
test4,
testarrayofstring,
testarrayoftables,
(this.enemy !== null ? this.enemy!.pack(builder) : 0),
testnestedflatbuffer,
(this.testempty !== null ? this.testempty!.pack(builder) : 0),
this.testbool,
this.testhashs32Fnv1,
this.testhashu32Fnv1,
this.testhashs64Fnv1,
this.testhashu64Fnv1,
this.testhashs32Fnv1a,
this.testhashu32Fnv1a,
this.testhashs64Fnv1a,
this.testhashu64Fnv1a,
testarrayofbools,
this.testf,
this.testf2,
this.testf3,
testarrayofstring2,
testarrayofsortedstruct,
flex,
test5,
vectorOfLongs,
vectorOfDoubles,
(this.parentNamespaceTest !== null ? this.parentNamespaceTest!.pack(builder) : 0),
vectorOfReferrables,
this.singleWeakReference,
vectorOfWeakReferences,
vectorOfStrongReferrables,
this.coOwningReference,
vectorOfCoOwningReferences,
this.nonOwningReference,
vectorOfNonOwningReferences,
this.anyUniqueType,
anyUnique,
this.anyAmbiguousType,
anyAmbiguous,
vectorOfEnums,
this.signedEnum
);
};
}
}
/**
@@ -3087,5 +3809,99 @@ static createTypeAliases(builder:flatbuffers.Builder, i8:number, u8:number, i16:
TypeAliases.addVf64(builder, vf64Offset);
return TypeAliases.endTypeAliases(builder);
}
/**
* @returns TypeAliasesT
*/
unpack(): TypeAliasesT {
return new TypeAliasesT(
this.i8(),
this.u8(),
this.i16(),
this.u16(),
this.i32(),
this.u32(),
this.i64(),
this.u64(),
this.f32(),
this.f64(),
this.bb!.createScalarList(this.v8.bind(this), this.v8Length()),
this.bb!.createScalarList(this.vf64.bind(this), this.vf64Length())
);
};
/**
* @param TypeAliasesT _o
*/
unpackTo(_o: TypeAliasesT): void {
_o.i8 = this.i8();
_o.u8 = this.u8();
_o.i16 = this.i16();
_o.u16 = this.u16();
_o.i32 = this.i32();
_o.u32 = this.u32();
_o.i64 = this.i64();
_o.u64 = this.u64();
_o.f32 = this.f32();
_o.f64 = this.f64();
_o.v8 = this.bb!.createScalarList(this.v8.bind(this), this.v8Length());
_o.vf64 = this.bb!.createScalarList(this.vf64.bind(this), this.vf64Length());
};
}
export class TypeAliasesT {
/**
* @constructor
* @param number i8
* @param number u8
* @param number i16
* @param number u16
* @param number i32
* @param number u32
* @param flatbuffers.Long i64
* @param flatbuffers.Long u64
* @param number f32
* @param number f64
* @param (number)[] v8
* @param (number)[] vf64
*/
constructor(
public i8: number = 0,
public u8: number = 0,
public i16: number = 0,
public u16: number = 0,
public i32: number = 0,
public u32: number = 0,
public i64: flatbuffers.Long = flatbuffers.createLong(0, 0),
public u64: flatbuffers.Long = flatbuffers.createLong(0, 0),
public f32: number = 0.0,
public f64: number = 0.0,
public v8: (number)[] = [],
public vf64: (number)[] = []
){};
/**
* @param flatbuffers.Builder builder
* @returns flatbuffers.Offset
*/
pack(builder:flatbuffers.Builder): flatbuffers.Offset {
const v8 = TypeAliases.createV8Vector(builder, this.v8);
const vf64 = TypeAliases.createVf64Vector(builder, this.vf64);
return TypeAliases.createTypeAliases(builder,
this.i8,
this.u8,
this.i16,
this.u16,
this.i32,
this.u32,
this.i64,
this.u64,
this.f32,
this.f64,
v8,
vf64
);
};
}
}

View File

@@ -8,7 +8,8 @@ export enum EnumInNestedNS{
A= 0,
B= 1,
C= 2
}};
};
}
/**
* @constructor
@@ -100,6 +101,42 @@ static createTableInNestedNS(builder:flatbuffers.Builder, foo:number):flatbuffer
TableInNestedNS.addFoo(builder, foo);
return TableInNestedNS.endTableInNestedNS(builder);
}
/**
* @returns TableInNestedNST
*/
unpack(): TableInNestedNST {
return new TableInNestedNST(
this.foo()
);
};
/**
* @param TableInNestedNST _o
*/
unpackTo(_o: TableInNestedNST): void {
_o.foo = this.foo();
};
}
export class TableInNestedNST {
/**
* @constructor
* @param number foo
*/
constructor(
public foo: number = 0
){};
/**
* @param flatbuffers.Builder builder
* @returns flatbuffers.Offset
*/
pack(builder:flatbuffers.Builder): flatbuffers.Offset {
return TableInNestedNS.createTableInNestedNS(builder,
this.foo
);
};
}
}
/**
@@ -178,5 +215,46 @@ static createStructInNestedNS(builder:flatbuffers.Builder, a: number, b: number)
return builder.offset();
};
/**
* @returns StructInNestedNST
*/
unpack(): StructInNestedNST {
return new StructInNestedNST(
this.a(),
this.b()
);
};
/**
* @param StructInNestedNST _o
*/
unpackTo(_o: StructInNestedNST): void {
_o.a = this.a();
_o.b = this.b();
};
}
export class StructInNestedNST {
/**
* @constructor
* @param number a
* @param number b
*/
constructor(
public a: number = 0,
public b: number = 0
){};
/**
* @param flatbuffers.Builder builder
* @returns flatbuffers.Offset
*/
pack(builder:flatbuffers.Builder): flatbuffers.Offset {
return StructInNestedNS.createStructInNestedNS(builder,
this.a,
this.b
);
};
}
}

View File

@@ -127,6 +127,52 @@ static createTableInFirstNS(builder:flatbuffers.Builder, fooTableOffset:flatbuff
TableInFirstNS.addFooStruct(builder, fooStructOffset);
return TableInFirstNS.endTableInFirstNS(builder);
}
/**
* @returns TableInFirstNST
*/
unpack(): TableInFirstNST {
return new TableInFirstNST(
(this.fooTable() !== null ? this.fooTable()!.unpack() : null),
this.fooEnum(),
(this.fooStruct() !== null ? this.fooStruct()!.unpack() : null)
);
};
/**
* @param TableInFirstNST _o
*/
unpackTo(_o: TableInFirstNST): void {
_o.fooTable = (this.fooTable() !== null ? this.fooTable()!.unpack() : null);
_o.fooEnum = this.fooEnum();
_o.fooStruct = (this.fooStruct() !== null ? this.fooStruct()!.unpack() : null);
};
}
export class TableInFirstNST {
/**
* @constructor
* @param NS8755221360535654258.NamespaceA.NamespaceB.TableInNestedNST|null fooTable
* @param NS8755221360535654258.NamespaceA.NamespaceB.EnumInNestedNS fooEnum
* @param NS8755221360535654258.NamespaceA.NamespaceB.StructInNestedNST|null fooStruct
*/
constructor(
public fooTable: NS8755221360535654258.NamespaceA.NamespaceB.TableInNestedNST|null = null,
public fooEnum: NS8755221360535654258.NamespaceA.NamespaceB.EnumInNestedNS = NS8755221360535654258.NamespaceA.NamespaceB.EnumInNestedNS.A,
public fooStruct: NS8755221360535654258.NamespaceA.NamespaceB.StructInNestedNST|null = null
){};
/**
* @param flatbuffers.Builder builder
* @returns flatbuffers.Offset
*/
pack(builder:flatbuffers.Builder): flatbuffers.Offset {
return TableInFirstNS.createTableInFirstNS(builder,
(this.fooTable !== null ? this.fooTable!.pack(builder) : 0),
this.fooEnum,
(this.fooStruct !== null ? this.fooStruct!.pack(builder) : 0)
);
};
}
}
/**
@@ -223,6 +269,47 @@ static createTableInC(builder:flatbuffers.Builder, referToA1Offset:flatbuffers.O
TableInC.addReferToA2(builder, referToA2Offset);
return TableInC.endTableInC(builder);
}
/**
* @returns TableInCT
*/
unpack(): TableInCT {
return new TableInCT(
(this.referToA1() !== null ? this.referToA1()!.unpack() : null),
(this.referToA2() !== null ? this.referToA2()!.unpack() : null)
);
};
/**
* @param TableInCT _o
*/
unpackTo(_o: TableInCT): void {
_o.referToA1 = (this.referToA1() !== null ? this.referToA1()!.unpack() : null);
_o.referToA2 = (this.referToA2() !== null ? this.referToA2()!.unpack() : null);
};
}
export class TableInCT {
/**
* @constructor
* @param NamespaceA.TableInFirstNST|null referToA1
* @param NamespaceA.SecondTableInAT|null referToA2
*/
constructor(
public referToA1: NamespaceA.TableInFirstNST|null = null,
public referToA2: NamespaceA.SecondTableInAT|null = null
){};
/**
* @param flatbuffers.Builder builder
* @returns flatbuffers.Offset
*/
pack(builder:flatbuffers.Builder): flatbuffers.Offset {
return TableInC.createTableInC(builder,
(this.referToA1 !== null ? this.referToA1!.pack(builder) : 0),
(this.referToA2 !== null ? this.referToA2!.pack(builder) : 0)
);
};
}
}
/**
@@ -301,5 +388,41 @@ static createSecondTableInA(builder:flatbuffers.Builder, referToCOffset:flatbuff
SecondTableInA.addReferToC(builder, referToCOffset);
return SecondTableInA.endSecondTableInA(builder);
}
/**
* @returns SecondTableInAT
*/
unpack(): SecondTableInAT {
return new SecondTableInAT(
(this.referToC() !== null ? this.referToC()!.unpack() : null)
);
};
/**
* @param SecondTableInAT _o
*/
unpackTo(_o: SecondTableInAT): void {
_o.referToC = (this.referToC() !== null ? this.referToC()!.unpack() : null);
};
}
export class SecondTableInAT {
/**
* @constructor
* @param NamespaceC.TableInCT|null referToC
*/
constructor(
public referToC: NamespaceC.TableInCT|null = null
){};
/**
* @param flatbuffers.Builder builder
* @returns flatbuffers.Offset
*/
pack(builder:flatbuffers.Builder): flatbuffers.Offset {
return SecondTableInA.createSecondTableInA(builder,
(this.referToC !== null ? this.referToC!.pack(builder) : 0)
);
};
}
}

View File

@@ -13,6 +13,39 @@ export enum Character{
Unused= 6
};
export function unionToCharacter(
type: Character,
accessor: (obj:Attacker|BookReader|Rapunzel|string) => Attacker|BookReader|Rapunzel|string|null
): Attacker|BookReader|Rapunzel|string|null {
switch(Character[type]) {
case 'NONE': return null;
case 'MuLan': return accessor(new Attacker())! as Attacker;
case 'Rapunzel': return accessor(new Rapunzel())! as Rapunzel;
case 'Belle': return accessor(new BookReader())! as BookReader;
case 'BookFan': return accessor(new BookReader())! as BookReader;
case 'Other': return accessor('') as string;
case 'Unused': return accessor('') as string;
default: return null;
}
}
export function unionListToCharacter(
type: Character,
accessor: (index: number, obj:Attacker|BookReader|Rapunzel|string) => Attacker|BookReader|Rapunzel|string|null,
index: number
): Attacker|BookReader|Rapunzel|string|null {
switch(Character[type]) {
case 'NONE': return null;
case 'MuLan': return accessor(index, new Attacker())! as Attacker;
case 'Rapunzel': return accessor(index, new Rapunzel())! as Rapunzel;
case 'Belle': return accessor(index, new BookReader())! as BookReader;
case 'BookFan': return accessor(index, new BookReader())! as BookReader;
case 'Other': return accessor(index, '') as string;
case 'Unused': return accessor(index, '') as string;
default: return null;
}
}
/**
* @constructor
*/
@@ -102,6 +135,42 @@ static createAttacker(builder:flatbuffers.Builder, swordAttackDamage:number):fla
Attacker.addSwordAttackDamage(builder, swordAttackDamage);
return Attacker.endAttacker(builder);
}
/**
* @returns AttackerT
*/
unpack(): AttackerT {
return new AttackerT(
this.swordAttackDamage()
);
};
/**
* @param AttackerT _o
*/
unpackTo(_o: AttackerT): void {
_o.swordAttackDamage = this.swordAttackDamage();
};
}
export class AttackerT {
/**
* @constructor
* @param number swordAttackDamage
*/
constructor(
public swordAttackDamage: number = 0
){};
/**
* @param flatbuffers.Builder builder
* @returns flatbuffers.Offset
*/
pack(builder:flatbuffers.Builder): flatbuffers.Offset {
return Attacker.createAttacker(builder,
this.swordAttackDamage
);
};
}
/**
* @constructor
@@ -154,6 +223,42 @@ static createRapunzel(builder:flatbuffers.Builder, hair_length: number):flatbuff
return builder.offset();
};
/**
* @returns RapunzelT
*/
unpack(): RapunzelT {
return new RapunzelT(
this.hairLength()
);
};
/**
* @param RapunzelT _o
*/
unpackTo(_o: RapunzelT): void {
_o.hairLength = this.hairLength();
};
}
export class RapunzelT {
/**
* @constructor
* @param number hairLength
*/
constructor(
public hairLength: number = 0
){};
/**
* @param flatbuffers.Builder builder
* @returns flatbuffers.Offset
*/
pack(builder:flatbuffers.Builder): flatbuffers.Offset {
return Rapunzel.createRapunzel(builder,
this.hairLength
);
};
}
/**
* @constructor
@@ -206,6 +311,42 @@ static createBookReader(builder:flatbuffers.Builder, books_read: number):flatbuf
return builder.offset();
};
/**
* @returns BookReaderT
*/
unpack(): BookReaderT {
return new BookReaderT(
this.booksRead()
);
};
/**
* @param BookReaderT _o
*/
unpackTo(_o: BookReaderT): void {
_o.booksRead = this.booksRead();
};
}
export class BookReaderT {
/**
* @constructor
* @param number booksRead
*/
constructor(
public booksRead: number = 0
){};
/**
* @param flatbuffers.Builder builder
* @returns flatbuffers.Offset
*/
pack(builder:flatbuffers.Builder): flatbuffers.Offset {
return BookReader.createBookReader(builder,
this.booksRead
);
};
}
/**
* @constructor
@@ -264,9 +405,9 @@ mainCharacterType():Character {
* @param flatbuffers.Table obj
* @returns ?flatbuffers.Table
*/
mainCharacter<T extends flatbuffers.Table>(obj:T):T|null {
mainCharacter<T extends flatbuffers.Table>(obj:T|string):T|string|null {
var offset = this.bb!.__offset(this.bb_pos, 6);
return offset ? this.bb!.__union(obj, this.bb_pos + offset) : null;
return offset ? this.bb!.__union_with_string(obj, this.bb_pos + offset) : null;
};
/**
@@ -299,9 +440,9 @@ charactersTypeArray():Uint8Array|null {
* @param flatbuffers.Table= obj
* @returns ?flatbuffers.Table
*/
characters<T extends flatbuffers.Table>(index: number, obj:T):T|null {
characters<T extends flatbuffers.Table>(index: number, obj:T|string):T|string|null {
var offset = this.bb!.__offset(this.bb_pos, 10);
return offset ? this.bb!.__union(obj, this.bb!.__vector(this.bb_pos + offset) + index * 4) : null;
return offset ? this.bb!.__union_with_string(obj, this.bb!.__vector(this.bb_pos + offset) + index * 4) : null;
};
/**
@@ -426,4 +567,93 @@ static createMovie(builder:flatbuffers.Builder, mainCharacterType:Character, mai
Movie.addCharacters(builder, charactersOffset);
return Movie.endMovie(builder);
}
/**
* @returns MovieT
*/
unpack(): MovieT {
return new MovieT(
this.mainCharacterType(),
(() => {
let temp = unionToCharacter(this.mainCharacterType(), this.mainCharacter.bind(this));
if(temp === null) { return null; }
if(typeof temp === 'string') { return temp; }
return temp.unpack()
})(),
this.bb!.createScalarList(this.charactersType.bind(this), this.charactersTypeLength()),
(() => {
let ret = [];
for(let targetEnumIndex = 0; targetEnumIndex < this.charactersTypeLength(); ++targetEnumIndex) {
let targetEnum = this.charactersType(targetEnumIndex);
if(targetEnum === null || Character[targetEnum!] === 'NONE') { continue; }
let temp = unionListToCharacter(targetEnum, this.characters.bind(this), targetEnumIndex);
if(temp === null) { continue; }
if(typeof temp === 'string') { ret.push(temp); continue; }
ret.push(temp.unpack());
}
return ret;
})()
);
};
/**
* @param MovieT _o
*/
unpackTo(_o: MovieT): void {
_o.mainCharacterType = this.mainCharacterType();
_o.mainCharacter = (() => {
let temp = unionToCharacter(this.mainCharacterType(), this.mainCharacter.bind(this));
if(temp === null) { return null; }
if(typeof temp === 'string') { return temp; }
return temp.unpack()
})();
_o.charactersType = this.bb!.createScalarList(this.charactersType.bind(this), this.charactersTypeLength());
_o.characters = (() => {
let ret = [];
for(let targetEnumIndex = 0; targetEnumIndex < this.charactersTypeLength(); ++targetEnumIndex) {
let targetEnum = this.charactersType(targetEnumIndex);
if(targetEnum === null || Character[targetEnum!] === 'NONE') { continue; }
let temp = unionListToCharacter(targetEnum, this.characters.bind(this), targetEnumIndex);
if(temp === null) { continue; }
if(typeof temp === 'string') { ret.push(temp); continue; }
ret.push(temp.unpack());
}
return ret;
})();
};
}
export class MovieT {
/**
* @constructor
* @param Character mainCharacterType
* @param AttackerT|BookReaderT|RapunzelT|string|null mainCharacter
* @param (Character)[] charactersType
* @param (AttackerT|BookReaderT|RapunzelT|string)[] characters
*/
constructor(
public mainCharacterType: Character = Character.NONE,
public mainCharacter: AttackerT|BookReaderT|RapunzelT|string|null = null,
public charactersType: (Character)[] = [],
public characters: (AttackerT|BookReaderT|RapunzelT|string)[] = []
){};
/**
* @param flatbuffers.Builder builder
* @returns flatbuffers.Offset
*/
pack(builder:flatbuffers.Builder): flatbuffers.Offset {
const mainCharacter = builder.createObjectOffset(this.mainCharacter);
const charactersType = Movie.createCharactersTypeVector(builder, this.charactersType);
const characters = Movie.createCharactersVector(builder, builder.createObjectOffsetList(this.characters));
return Movie.createMovie(builder,
this.mainCharacterType,
mainCharacter,
charactersType,
characters
);
};
}