refactor API and add support for more instructions
[power-instruction-analyzer.git] / src / serde_hex.rs
index 17ec8a8b22fe9aaa4d0dad8e7b3fdad0ea8cdbb5..be362c8b02f4d17f5af3da1df3e9cfef8ffd35a7 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: LGPL-2.1-or-later
 // See Notices.txt for copyright information
 
-use serde::{de, Deserialize, Deserializer, Serializer};
+use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
 
 pub(crate) trait SerdeHex {
     fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error>;
@@ -10,6 +10,31 @@ pub(crate) trait SerdeHex {
         Self: Sized;
 }
 
+#[derive(Deserialize, Serialize)]
+struct SerdeHexWrapper<T: SerdeHex>(#[serde(with = "SerdeHex")] T);
+
+fn serialize_ref_helper<T: SerdeHex, S: Serializer>(
+    v: &&T,
+    serializer: S,
+) -> Result<S::Ok, S::Error> {
+    v.serialize(serializer)
+}
+
+#[derive(Serialize)]
+struct SerdeHexRefWrapper<'a, T: SerdeHex>(#[serde(serialize_with = "serialize_ref_helper")] &'a T);
+
+impl<T: SerdeHex> SerdeHex for Option<T> {
+    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
+        self.as_ref().map(SerdeHexRefWrapper).serialize(serializer)
+    }
+    fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error>
+    where
+        Self: Sized,
+    {
+        Ok(Option::<SerdeHexWrapper<T>>::deserialize(deserializer)?.map(|v| v.0))
+    }
+}
+
 macro_rules! impl_hex_for_uint {
     ($ty:ty) => {
         impl SerdeHex for $ty {