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 <dverkamp@chromium.org>
Tested-by: kokoro <noreply+kokoro@google.com>
Tested-by: Zach Reizner <zachr@chromium.org>
Commit-Queue: Zach Reizner <zachr@chromium.org>
This commit is contained in:
Zach Reizner 2020-12-11 14:12:41 -08:00 committed by Commit Bot
parent 4f41c7ebc7
commit 4f3f332209
3 changed files with 43 additions and 1 deletions

21
Cargo.lock generated
View file

@ -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"

View file

@ -8,5 +8,6 @@ include = ["src/**/*", "Cargo.toml"]
[dependencies]
assertions = { path = "../assertions" } # provided by ebuild
libc = "*"
serde = { version = "1", features = ["derive"] }
[workspace]

View file

@ -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<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
self.to_native().serialize(serializer)
}
}
impl<'de> Deserialize<'de> for $new_type {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
Ok($old_type::deserialize(deserializer)?.into())
}
}
};
}