| // Copyright 2019 Google LLC | |
| // | |
| // 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 | |
| // | |
| // https://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. | |
| extern crate flexbuffers; | |
| extern crate serde; | |
| #[macro_use] | |
| extern crate serde_derive; | |
| use serde::{Deserialize, Serialize}; | |
| #[derive(Debug, PartialEq, Serialize, Deserialize)] | |
| enum Weapon { | |
| Fist, | |
| Equipment { name: String, damage: i32 }, | |
| } | |
| #[derive(Debug, PartialEq, Serialize, Deserialize)] | |
| struct Color(u8, u8, u8, u8); | |
| #[derive(Debug, PartialEq, Serialize, Deserialize)] | |
| struct Monster { | |
| hp: u32, | |
| mana: i32, | |
| enraged: bool, | |
| weapons: Vec<Weapon>, | |
| color: Color, | |
| position: [f64; 3], | |
| velocity: [f64; 3], | |
| coins: Vec<u32>, | |
| } | |
| fn main() { | |
| let monster = Monster { | |
| hp: 80, | |
| mana: 200, | |
| enraged: true, | |
| color: Color(255, 255, 255, 255), | |
| position: [0.0; 3], | |
| velocity: [1.0, 0.0, 0.0], | |
| weapons: vec![ | |
| Weapon::Fist, | |
| Weapon::Equipment { name: "great axe".to_string(), damage: 15 }, | |
| Weapon::Equipment { name: "hammer".to_string(), damage: 5 }, | |
| ], | |
| coins: vec![5, 10, 25, 25, 25, 100], | |
| }; | |
| let mut s = flexbuffers::FlexbufferSerializer::new(); | |
| monster.serialize(&mut s).unwrap(); | |
| let r = flexbuffers::Reader::get_root(s.view()).unwrap(); | |
| // Serialization is similar to JSON. Field names are stored in the buffer but are reused | |
| // between all maps and structs. | |
| println!("Monster stored in {:?} bytes.", s.view().len()); | |
| println!("{}", r); | |
| let monster2 = Monster::deserialize(r).unwrap(); | |
| assert_eq!(monster, monster2); | |
| } | |
| #[test] | |
| fn test_main() { | |
| main() | |
| } |