Skip to content

Commit abdce55

Browse files
committed
feat: patch add support
Signed-off-by: Woshiluo Luo <woshiluo.luo@outlook.com>
1 parent 613a4cd commit abdce55

File tree

2 files changed

+92
-27
lines changed

2 files changed

+92
-27
lines changed

src/ser/mod.rs

Lines changed: 86 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -59,34 +59,14 @@ impl<'de> Serializer<'de> {
5959
}
6060
}
6161

62-
impl<'a, 'de> serde::ser::SerializeMap for &'a mut Serializer<'de> {
63-
type Ok = ();
64-
type Error = Error;
65-
66-
fn serialize_key<T>(&mut self, _input: &T) -> Result<(), Self::Error>
62+
trait SerializeDynamicField<'de> {
63+
fn serialize_dynamic_field<T>(&mut self, key: &'de str, value: &T) -> Result<(), Error>
6764
where
68-
T: serde::ser::Serialize + ?Sized,
69-
{
70-
todo!("map_key");
71-
}
72-
73-
fn serialize_value<T>(&mut self, _value: &T) -> Result<(), Self::Error>
74-
where
75-
T: serde::ser::Serialize + ?Sized,
76-
{
77-
todo!("map_value");
78-
}
79-
80-
fn end(self) -> Result<Self::Ok, Self::Error> {
81-
todo!("map_end");
82-
}
65+
T: serde::ser::Serialize + ?Sized;
8366
}
8467

85-
impl<'a, 'de> serde::ser::SerializeStruct for &'a mut Serializer<'de> {
86-
type Ok = ();
87-
type Error = Error;
88-
89-
fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
68+
impl<'a, 'de> SerializeDynamicField<'de> for &'a mut Serializer<'de> {
69+
fn serialize_dynamic_field<T>(&mut self, key: &'de str, value: &T) -> Result<(), Error>
9070
where
9171
T: serde::ser::Serialize + ?Sized,
9272
{
@@ -127,9 +107,49 @@ impl<'a, 'de> serde::ser::SerializeStruct for &'a mut Serializer<'de> {
127107

128108
Ok(())
129109
}
110+
}
111+
112+
impl<'a, 'de> serde::ser::SerializeMap for &'a mut Serializer<'de> {
113+
type Ok = ();
114+
type Error = Error;
115+
116+
fn serialize_key<T>(&mut self, _input: &T) -> Result<(), Self::Error>
117+
where
118+
T: serde::ser::Serialize + ?Sized,
119+
{
120+
todo!("map_key");
121+
}
122+
123+
fn serialize_value<T>(&mut self, _value: &T) -> Result<(), Self::Error>
124+
where
125+
T: serde::ser::Serialize + ?Sized,
126+
{
127+
todo!("map_value");
128+
}
130129

131130
fn end(self) -> Result<Self::Ok, Self::Error> {
132-
// TODO: patch type add
131+
todo!("map_end");
132+
}
133+
}
134+
135+
impl<'a, 'de> serde::ser::SerializeStruct for &'a mut Serializer<'de> {
136+
type Ok = ();
137+
type Error = Error;
138+
139+
fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
140+
where
141+
T: serde::ser::Serialize + ?Sized,
142+
{
143+
self.serialize_dynamic_field(key, value)?;
144+
145+
Ok(())
146+
}
147+
148+
fn end(mut self) -> Result<Self::Ok, Self::Error> {
149+
for patch in self.patch_list.add_list(self.current_dep) {
150+
let key = patch.get_depth_path(self.current_dep + 1);
151+
self.serialize_dynamic_field(key, patch.data)?;
152+
}
133153
self.dst.step_by_u32(FDT_END_NODE);
134154
Ok(())
135155
}
@@ -408,7 +428,7 @@ mod tests {
408428
use crate::common::*;
409429
use serde::ser::Serialize;
410430
use serde_derive::Serialize;
411-
const MAX_SIZE: usize = 128 + 64;
431+
const MAX_SIZE: usize = 128 + 64 + 32;
412432
#[test]
413433
fn base_ser_test() {
414434
#[derive(Serialize)]
@@ -631,6 +651,45 @@ mod tests {
631651
ser.dst.step_by_u32(FDT_END);
632652
}
633653
// TODO: check buf1 buf2
654+
// println!("{:x?} {:x?}", buf1, buf2);
655+
// assert!(false);
656+
}
657+
#[test]
658+
fn add_node_ser_test() {
659+
#[derive(Serialize)]
660+
struct Base {
661+
pub hello: u32,
662+
pub base1: Base1,
663+
pub hello2: u32,
664+
pub base2: Base1,
665+
}
666+
#[derive(Serialize)]
667+
struct Base1 {
668+
pub hello: &'static str,
669+
}
670+
let mut buf1 = [0u8; MAX_SIZE];
671+
let mut buf2 = [0u8; MAX_SIZE];
672+
673+
{
674+
let mut dst = crate::ser::Pointer::new(&mut buf1);
675+
let mut block = crate::ser::StringBlock::new(&mut buf2);
676+
let new_base = Base1 { hello: "added" };
677+
let patch = crate::ser::patch::Patch::new("/base3", &new_base as _);
678+
let mut list = [patch];
679+
let mut patch_list = crate::ser::PatchList::new(&mut list);
680+
let mut ser = crate::ser::Serializer::new(&mut dst, &mut block, &mut patch_list);
681+
let base = Base {
682+
hello: 0xdeedbeef,
683+
base1: Base1 {
684+
hello: "Hello, World!",
685+
},
686+
hello2: 0x11223344,
687+
base2: Base1 { hello: "Roger" },
688+
};
689+
base.serialize(&mut ser).unwrap();
690+
ser.dst.step_by_u32(FDT_END);
691+
}
692+
// TODO: check buf1 buf2
634693
println!("{:x?} {:x?}", buf1, buf2);
635694
assert!(false);
636695
}

src/ser/patch.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,4 +78,10 @@ impl<'de> PatchList<'de> {
7878
}
7979
});
8080
}
81+
82+
pub fn add_list(&self, depth: usize) -> impl Iterator<Item = &'de Patch<'de>> + use<'de> {
83+
self.list.iter().filter(move |x| {
84+
x.matched_depth.get() == depth && x.get_depth() == depth + 1 && x.parsed.get() == false
85+
})
86+
}
8187
}

0 commit comments

Comments
 (0)