xref: /aosp_15_r20/external/flatbuffers/samples/sample_flexbuffers_serde.rs (revision 890232f25432b36107d06881e0a25aaa6b473652)
1*890232f2SAndroid Build Coastguard Worker // Copyright 2019 Google LLC
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 //     https://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 Worker extern crate flexbuffers;
16*890232f2SAndroid Build Coastguard Worker extern crate serde;
17*890232f2SAndroid Build Coastguard Worker #[macro_use]
18*890232f2SAndroid Build Coastguard Worker extern crate serde_derive;
19*890232f2SAndroid Build Coastguard Worker use serde::{Deserialize, Serialize};
20*890232f2SAndroid Build Coastguard Worker 
21*890232f2SAndroid Build Coastguard Worker #[derive(Debug, PartialEq, Serialize, Deserialize)]
22*890232f2SAndroid Build Coastguard Worker enum Weapon {
23*890232f2SAndroid Build Coastguard Worker     Fist,
24*890232f2SAndroid Build Coastguard Worker     Equipment { name: String, damage: i32 },
25*890232f2SAndroid Build Coastguard Worker }
26*890232f2SAndroid Build Coastguard Worker 
27*890232f2SAndroid Build Coastguard Worker #[derive(Debug, PartialEq, Serialize, Deserialize)]
28*890232f2SAndroid Build Coastguard Worker struct Color(u8, u8, u8, u8);
29*890232f2SAndroid Build Coastguard Worker 
30*890232f2SAndroid Build Coastguard Worker #[derive(Debug, PartialEq, Serialize, Deserialize)]
31*890232f2SAndroid Build Coastguard Worker struct Monster {
32*890232f2SAndroid Build Coastguard Worker     hp: u32,
33*890232f2SAndroid Build Coastguard Worker     mana: i32,
34*890232f2SAndroid Build Coastguard Worker     enraged: bool,
35*890232f2SAndroid Build Coastguard Worker     weapons: Vec<Weapon>,
36*890232f2SAndroid Build Coastguard Worker     color: Color,
37*890232f2SAndroid Build Coastguard Worker     position: [f64; 3],
38*890232f2SAndroid Build Coastguard Worker     velocity: [f64; 3],
39*890232f2SAndroid Build Coastguard Worker     coins: Vec<u32>,
40*890232f2SAndroid Build Coastguard Worker }
41*890232f2SAndroid Build Coastguard Worker 
main()42*890232f2SAndroid Build Coastguard Worker fn main() {
43*890232f2SAndroid Build Coastguard Worker     let monster = Monster {
44*890232f2SAndroid Build Coastguard Worker         hp: 80,
45*890232f2SAndroid Build Coastguard Worker         mana: 200,
46*890232f2SAndroid Build Coastguard Worker         enraged: true,
47*890232f2SAndroid Build Coastguard Worker         color: Color(255, 255, 255, 255),
48*890232f2SAndroid Build Coastguard Worker         position: [0.0; 3],
49*890232f2SAndroid Build Coastguard Worker         velocity: [1.0, 0.0, 0.0],
50*890232f2SAndroid Build Coastguard Worker         weapons: vec![
51*890232f2SAndroid Build Coastguard Worker             Weapon::Fist,
52*890232f2SAndroid Build Coastguard Worker             Weapon::Equipment {
53*890232f2SAndroid Build Coastguard Worker                 name: "great axe".to_string(),
54*890232f2SAndroid Build Coastguard Worker                 damage: 15,
55*890232f2SAndroid Build Coastguard Worker             },
56*890232f2SAndroid Build Coastguard Worker             Weapon::Equipment {
57*890232f2SAndroid Build Coastguard Worker                 name: "hammer".to_string(),
58*890232f2SAndroid Build Coastguard Worker                 damage: 5,
59*890232f2SAndroid Build Coastguard Worker             },
60*890232f2SAndroid Build Coastguard Worker         ],
61*890232f2SAndroid Build Coastguard Worker         coins: vec![5, 10, 25, 25, 25, 100],
62*890232f2SAndroid Build Coastguard Worker     };
63*890232f2SAndroid Build Coastguard Worker     let mut s = flexbuffers::FlexbufferSerializer::new();
64*890232f2SAndroid Build Coastguard Worker     monster.serialize(&mut s).unwrap();
65*890232f2SAndroid Build Coastguard Worker 
66*890232f2SAndroid Build Coastguard Worker     let r = flexbuffers::Reader::get_root(s.view()).unwrap();
67*890232f2SAndroid Build Coastguard Worker 
68*890232f2SAndroid Build Coastguard Worker     // Serialization is similar to JSON. Field names are stored in the buffer but are reused
69*890232f2SAndroid Build Coastguard Worker     // between all maps and structs.
70*890232f2SAndroid Build Coastguard Worker     println!("Monster stored in {:?} bytes.", s.view().len());
71*890232f2SAndroid Build Coastguard Worker     println!("{}", r);
72*890232f2SAndroid Build Coastguard Worker 
73*890232f2SAndroid Build Coastguard Worker     let monster2 = Monster::deserialize(r).unwrap();
74*890232f2SAndroid Build Coastguard Worker 
75*890232f2SAndroid Build Coastguard Worker     assert_eq!(monster, monster2);
76*890232f2SAndroid Build Coastguard Worker }
77*890232f2SAndroid Build Coastguard Worker 
78*890232f2SAndroid Build Coastguard Worker #[test]
test_main()79*890232f2SAndroid Build Coastguard Worker fn test_main() {
80*890232f2SAndroid Build Coastguard Worker     main()
81*890232f2SAndroid Build Coastguard Worker }
82