xref: /aosp_15_r20/external/flatbuffers/samples/sample_binary.lobster (revision 890232f25432b36107d06881e0a25aaa6b473652)
1*890232f2SAndroid Build Coastguard Worker// Copyright 2018 Google Inc. All rights reserved.
2*890232f2SAndroid Build Coastguard Worker//
3*890232f2SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*890232f2SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*890232f2SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*890232f2SAndroid Build Coastguard Worker//
7*890232f2SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*890232f2SAndroid Build Coastguard Worker//
9*890232f2SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*890232f2SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*890232f2SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*890232f2SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*890232f2SAndroid Build Coastguard Worker// limitations under the License.
14*890232f2SAndroid Build Coastguard Worker
15*890232f2SAndroid Build Coastguard Workerimport from "../lobster/"
16*890232f2SAndroid Build Coastguard Workerimport monster_generated
17*890232f2SAndroid Build Coastguard Worker
18*890232f2SAndroid Build Coastguard Worker// Example of how to use FlatBuffers to create and read binary buffers.
19*890232f2SAndroid Build Coastguard Worker
20*890232f2SAndroid Build Coastguard Worker// Create a builder.
21*890232f2SAndroid Build Coastguard Workerlet b = flatbuffers_builder {}
22*890232f2SAndroid Build Coastguard Worker
23*890232f2SAndroid Build Coastguard Worker// Create some weapons for our monster.
24*890232f2SAndroid Build Coastguard Workerlet weapon_names = [ "Sword", "Axe" ]
25*890232f2SAndroid Build Coastguard Workerlet weapon_damages = [ 3, 5 ]
26*890232f2SAndroid Build Coastguard Worker
27*890232f2SAndroid Build Coastguard Workerlet weapon_offsets = map(weapon_names) name, i:
28*890232f2SAndroid Build Coastguard Worker    let ns = b.CreateString(name)
29*890232f2SAndroid Build Coastguard Worker    MyGame_Sample_WeaponBuilder { b }
30*890232f2SAndroid Build Coastguard Worker        .start()
31*890232f2SAndroid Build Coastguard Worker        .add_name(ns)
32*890232f2SAndroid Build Coastguard Worker        .add_damage(weapon_damages[i])
33*890232f2SAndroid Build Coastguard Worker        .end()
34*890232f2SAndroid Build Coastguard Worker
35*890232f2SAndroid Build Coastguard Workerlet weapons = b.MyGame_Sample_MonsterCreateWeaponsVector(weapon_offsets)
36*890232f2SAndroid Build Coastguard Worker
37*890232f2SAndroid Build Coastguard Worker// Name of the monster.
38*890232f2SAndroid Build Coastguard Workerlet name = b.CreateString("Orc")
39*890232f2SAndroid Build Coastguard Worker
40*890232f2SAndroid Build Coastguard Worker// Inventory.
41*890232f2SAndroid Build Coastguard Workerlet inv = b.MyGame_Sample_MonsterCreateInventoryVector(map(10): _)
42*890232f2SAndroid Build Coastguard Worker
43*890232f2SAndroid Build Coastguard Worker// Now pack it all together in our root monster object.
44*890232f2SAndroid Build Coastguard Workerlet orc = MyGame_Sample_MonsterBuilder { b }
45*890232f2SAndroid Build Coastguard Worker    .start()
46*890232f2SAndroid Build Coastguard Worker    .add_pos(b.MyGame_Sample_CreateVec3(1.0, 2.0, 3.0))
47*890232f2SAndroid Build Coastguard Worker    .add_hp(300)
48*890232f2SAndroid Build Coastguard Worker    .add_name(name)
49*890232f2SAndroid Build Coastguard Worker    .add_inventory(inv)
50*890232f2SAndroid Build Coastguard Worker    .add_color(MyGame_Sample_Color_Red)
51*890232f2SAndroid Build Coastguard Worker    .add_weapons(weapons)
52*890232f2SAndroid Build Coastguard Worker    .add_equipped_type(MyGame_Sample_Equipment_Weapon)
53*890232f2SAndroid Build Coastguard Worker    .add_equipped(weapon_offsets[1])
54*890232f2SAndroid Build Coastguard Worker    .end()
55*890232f2SAndroid Build Coastguard Worker
56*890232f2SAndroid Build Coastguard Worker// Finish the buffer!
57*890232f2SAndroid Build Coastguard Workerb.Finish(orc, "MONS")
58*890232f2SAndroid Build Coastguard Worker
59*890232f2SAndroid Build Coastguard Worker// We now have a FlatBuffer that we could store on disk or send over a network.
60*890232f2SAndroid Build Coastguard Worker
61*890232f2SAndroid Build Coastguard Workerlet buf = b.SizedCopy()
62*890232f2SAndroid Build Coastguard Worker
63*890232f2SAndroid Build Coastguard Worker// ...Saving to file or sending over a network code goes here...
64*890232f2SAndroid Build Coastguard Worker
65*890232f2SAndroid Build Coastguard Worker// Instead, we are going to access this buffer right away (as if we just
66*890232f2SAndroid Build Coastguard Worker// received it).
67*890232f2SAndroid Build Coastguard Worker
68*890232f2SAndroid Build Coastguard Worker// Get the root object accessor.
69*890232f2SAndroid Build Coastguard Workerlet monster = MyGame_Sample_GetRootAsMonster(buf)
70*890232f2SAndroid Build Coastguard Worker
71*890232f2SAndroid Build Coastguard Worker// Note: We did not set the `mana` field explicitly, so we get a default value.
72*890232f2SAndroid Build Coastguard Workerassert monster.mana == 150
73*890232f2SAndroid Build Coastguard Workerassert monster.hp == 300
74*890232f2SAndroid Build Coastguard Workerassert monster.name == "Orc"
75*890232f2SAndroid Build Coastguard Workerassert monster.color == MyGame_Sample_Color_Red
76*890232f2SAndroid Build Coastguard Workerlet pos = monster.pos
77*890232f2SAndroid Build Coastguard Workerassert pos
78*890232f2SAndroid Build Coastguard Workerassert pos.x == 1.0
79*890232f2SAndroid Build Coastguard Workerassert pos.y == 2.0
80*890232f2SAndroid Build Coastguard Workerassert pos.z == 3.0
81*890232f2SAndroid Build Coastguard Worker
82*890232f2SAndroid Build Coastguard Worker// Get and test the `inventory` FlatBuffer vector.
83*890232f2SAndroid Build Coastguard Workerfor(monster.inventory_length) e, i:
84*890232f2SAndroid Build Coastguard Worker  assert monster.inventory(i) == e
85*890232f2SAndroid Build Coastguard Worker
86*890232f2SAndroid Build Coastguard Worker// Get and test the `weapons` FlatBuffer vector of tables.
87*890232f2SAndroid Build Coastguard Workerfor(monster.weapons_length) i:
88*890232f2SAndroid Build Coastguard Worker  assert monster.weapons(i).name == weapon_names[i]
89*890232f2SAndroid Build Coastguard Worker  assert monster.weapons(i).damage == weapon_damages[i]
90*890232f2SAndroid Build Coastguard Worker
91*890232f2SAndroid Build Coastguard Worker// Get and test the `equipped` FlatBuffer union.
92*890232f2SAndroid Build Coastguard Workerassert monster.equipped_type() == MyGame_Sample_Equipment_Weapon
93*890232f2SAndroid Build Coastguard Worker
94*890232f2SAndroid Build Coastguard Worker// Now that we know the union value is a weapon, we can safely call as_Weapon:
95*890232f2SAndroid Build Coastguard Workerlet union_weapon = monster.equipped_as_Weapon
96*890232f2SAndroid Build Coastguard Worker
97*890232f2SAndroid Build Coastguard Workerassert union_weapon.name == "Axe"
98*890232f2SAndroid Build Coastguard Workerassert union_weapon.damage == 5
99*890232f2SAndroid Build Coastguard Worker
100*890232f2SAndroid Build Coastguard Workerprint "The FlatBuffer was successfully created and verified!"
101