| // Copyright 2018 Google Inc. All rights reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| import from "../lobster/" |
| import monster_generated |
| |
| // Example of how to use FlatBuffers to create and read binary buffers. |
| |
| // Create a builder. |
| let b = flatbuffers_builder {} |
| |
| // Create some weapons for our monster. |
| let weapon_names = [ "Sword", "Axe" ] |
| let weapon_damages = [ 3, 5 ] |
| |
| let weapon_offsets = map(weapon_names) name, i: |
| let ns = b.CreateString(name) |
| MyGame_Sample_WeaponBuilder { b } |
| .start() |
| .add_name(ns) |
| .add_damage(weapon_damages[i]) |
| .end() |
| |
| let weapons = b.MyGame_Sample_MonsterCreateWeaponsVector(weapon_offsets) |
| |
| // Name of the monster. |
| let name = b.CreateString("Orc") |
| |
| // Inventory. |
| let inv = b.MyGame_Sample_MonsterCreateInventoryVector(map(10): _) |
| |
| // Now pack it all together in our root monster object. |
| let orc = MyGame_Sample_MonsterBuilder { b } |
| .start() |
| .add_pos(b.MyGame_Sample_CreateVec3(1.0, 2.0, 3.0)) |
| .add_hp(300) |
| .add_name(name) |
| .add_inventory(inv) |
| .add_color(MyGame_Sample_Color_Red) |
| .add_weapons(weapons) |
| .add_equipped_type(MyGame_Sample_Equipment_Weapon) |
| .add_equipped(weapon_offsets[1]) |
| .end() |
| |
| // Finish the buffer! |
| b.Finish(orc, "MONS") |
| |
| // We now have a FlatBuffer that we could store on disk or send over a network. |
| |
| let buf = b.SizedCopy() |
| |
| // ...Saving to file or sending over a network code goes here... |
| |
| // Instead, we are going to access this buffer right away (as if we just |
| // received it). |
| |
| // Get the root object accessor. |
| let monster = MyGame_Sample_GetRootAsMonster(buf) |
| |
| // Note: We did not set the `mana` field explicitly, so we get a default value. |
| assert monster.mana == 150 |
| assert monster.hp == 300 |
| assert monster.name == "Orc" |
| assert monster.color == MyGame_Sample_Color_Red |
| let pos = monster.pos |
| assert pos |
| assert pos.x == 1.0 |
| assert pos.y == 2.0 |
| assert pos.z == 3.0 |
| |
| // Get and test the `inventory` FlatBuffer vector. |
| for(monster.inventory_length) e, i: |
| assert monster.inventory(i) == e |
| |
| // Get and test the `weapons` FlatBuffer vector of tables. |
| for(monster.weapons_length) i: |
| assert monster.weapons(i).name == weapon_names[i] |
| assert monster.weapons(i).damage == weapon_damages[i] |
| |
| // Get and test the `equipped` FlatBuffer union. |
| assert monster.equipped_type() == MyGame_Sample_Equipment_Weapon |
| |
| // Now that we know the union value is a weapon, we can safely call as_Weapon: |
| let union_weapon = monster.equipped_as_Weapon |
| |
| assert union_weapon.name == "Axe" |
| assert union_weapon.damage == 5 |
| |
| print "The FlatBuffer was successfully created and verified!" |