From 4f3f3322099777d4f2a4f5e86f20ec443be182f3 Mon Sep 17 00:00:00 2001 From: Zach Reizner Date: Fri, 11 Dec 2020 14:12:41 -0800 Subject: [PATCH] data_model: make endian types Serialize and Deserialize By using these traits in crosvm, we also add serde as a dependency. BUG=b:176847362 TEST=run_tests Cq-Depend: chromium:2729637 Change-Id: Icd16a6e163d9e1dedbe3924cb94f29d777eb2216 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/2613690 Reviewed-by: Daniel Verkamp Tested-by: kokoro Tested-by: Zach Reizner Commit-Queue: Zach Reizner --- Cargo.lock | 21 +++++++++++++++++++++ data_model/Cargo.toml | 1 + data_model/src/endian.rs | 22 +++++++++++++++++++++- 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 470de6e541..9d9e769950 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -230,6 +230,7 @@ version = "0.1.0" dependencies = [ "assertions", "libc", + "serde", ] [[package]] @@ -877,6 +878,26 @@ dependencies = [ "sync", ] +[[package]] +name = "serde" +version = "1.0.121" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6159e3c76cab06f6bc466244d43b35e77e9500cd685da87620addadc2a4c40b1" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.121" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3fcab8778dc651bc65cfab2e4eb64996f3c912b74002fb379c94517e1f27c46" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "slab" version = "0.4.2" diff --git a/data_model/Cargo.toml b/data_model/Cargo.toml index 3909956f6b..51c85a6924 100644 --- a/data_model/Cargo.toml +++ b/data_model/Cargo.toml @@ -8,5 +8,6 @@ include = ["src/**/*", "Cargo.toml"] [dependencies] assertions = { path = "../assertions" } # provided by ebuild libc = "*" +serde = { version = "1", features = ["derive"] } [workspace] diff --git a/data_model/src/endian.rs b/data_model/src/endian.rs index 014bb7bdc2..686b8a182c 100644 --- a/data_model/src/endian.rs +++ b/data_model/src/endian.rs @@ -30,9 +30,11 @@ //! assert_ne!(b_trans, l_trans); //! ``` -use assertions::const_assert; use std::mem::{align_of, size_of}; +use assertions::const_assert; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; + use crate::DataInit; macro_rules! endian_type { @@ -80,6 +82,24 @@ macro_rules! endian_type { $new_type($old_type::$to_new(v)) } } + + impl Serialize for $new_type { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + self.to_native().serialize(serializer) + } + } + + impl<'de> Deserialize<'de> for $new_type { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + Ok($old_type::deserialize(deserializer)?.into()) + } + } }; }