Skip to content

Commit 55143de

Browse files
committed
feat: add StructAcessType to ensure access type
Signed-off-by: Woshiluo Luo <woshiluo.luo@outlook.com>
1 parent 833ef96 commit 55143de

File tree

4 files changed

+37
-12
lines changed

4 files changed

+37
-12
lines changed

src/de_mut/data.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use super::{DtError, PropCursor, RefDtb, RegConfig};
44
use core::marker::PhantomData;
55
use serde::{de, Deserialize};
66

7-
#[derive(Clone, Debug)]
7+
#[derive(Clone, Copy, Debug)]
88
pub(super) enum ValueCursor {
99
Prop(PropCursor),
1010
Body(BodyCursor),
@@ -304,10 +304,10 @@ impl<'de> de::Deserializer<'de> for &mut ValueDeserializer<'de> {
304304
where
305305
V: de::Visitor<'de>,
306306
{
307-
use super::{StructAccess, Temp};
307+
use super::{StructAccess, StructAccessType, Temp};
308308
if let ValueCursor::Body(cursor) = self.cursor {
309309
return visitor.visit_map(StructAccess {
310-
fields: None,
310+
access_type: StructAccessType::Map(false),
311311
temp: Temp::Node(self.body_cursor, cursor),
312312
de: self,
313313
});
@@ -324,10 +324,10 @@ impl<'de> de::Deserializer<'de> for &mut ValueDeserializer<'de> {
324324
where
325325
V: de::Visitor<'de>,
326326
{
327-
use super::{StructAccess, Temp};
327+
use super::{StructAccess, StructAccessType, Temp};
328328
if let ValueCursor::Body(cursor) = self.cursor {
329329
return visitor.visit_map(StructAccess {
330-
fields: Some(fields),
330+
access_type: StructAccessType::Struct(fields),
331331
temp: Temp::Node(self.body_cursor, cursor),
332332
de: self,
333333
});

src/de_mut/mod.rs

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,15 @@ where
5353
})
5454
}
5555

56+
// For map type, we should send root item to trans dtb and reg
57+
enum StructAccessType {
58+
Map(bool),
59+
Struct(&'static [&'static str]),
60+
}
61+
5662
/// 结构体解析状态。
5763
struct StructAccess<'de, 'b> {
58-
fields: Option<&'static [&'static str]>,
64+
access_type: StructAccessType,
5965
temp: Temp,
6066
de: &'b mut ValueDeserializer<'de>,
6167
}
@@ -77,10 +83,17 @@ impl<'de> de::MapAccess<'de> for StructAccess<'de, '_> {
7783
where
7884
K: de::DeserializeSeed<'de>,
7985
{
86+
if let StructAccessType::Map(flag) = self.access_type {
87+
if !flag {
88+
return seed
89+
.deserialize(de::value::BorrowedStrDeserializer::new("/"))
90+
.map(Some);
91+
}
92+
}
8093
let check_contains = |name: &str| -> bool {
81-
match self.fields {
82-
Some(fields) => fields.contains(&name),
83-
None => true,
94+
match self.access_type {
95+
StructAccessType::Struct(fields) => fields.contains(&name),
96+
_ => true,
8497
}
8598
};
8699
let name = loop {
@@ -148,6 +161,17 @@ impl<'de> de::MapAccess<'de> for StructAccess<'de, '_> {
148161
where
149162
V: de::DeserializeSeed<'de>,
150163
{
164+
if let StructAccessType::Map(ref mut flag) = self.access_type {
165+
if !*flag {
166+
*flag = true;
167+
return seed.deserialize(&mut ValueDeserializer {
168+
dtb: self.de.dtb,
169+
reg: self.de.reg,
170+
body_cursor: self.de.body_cursor,
171+
cursor: self.de.cursor,
172+
});
173+
}
174+
}
151175
match self.temp {
152176
Temp::Node(origin_cursor, cursor) => {
153177
// 键是独立节点名字,递归

src/de_mut/node.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,9 +179,12 @@ impl<'de> Deserialize<'de> for Node<'_> {
179179
let mut reg: Option<RegConfig> = None;
180180
let mut props_start: Option<BodyCursor> = None;
181181
let mut nodes_start: Option<BodyCursor> = None;
182-
while let Some((_, value)) = access.next_entry::<&str, ValueDeserializer<'b>>()? {
182+
while let Some((key, value)) = access.next_entry::<&str, ValueDeserializer<'b>>()? {
183183
dtb = Some(value.dtb);
184184
reg = Some(value.reg);
185+
if key == "/" {
186+
continue;
187+
}
185188
match value.cursor {
186189
ValueCursor::Prop(_) => {
187190
if props_start.is_none() {
@@ -196,7 +199,6 @@ impl<'de> Deserialize<'de> for Node<'_> {
196199
}
197200
}
198201

199-
// TODO: May panic if a node have no children & prop
200202
Ok(Node {
201203
dtb: dtb.unwrap(),
202204
reg: reg.unwrap(),

src/utils/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ impl Node<'_> {
5454

5555
#[cfg(test)]
5656
mod tests {
57-
use super::*;
5857
use crate::{
5958
buildin::{Node, StrSeq},
6059
from_raw_mut, Dtb, DtbPtr,

0 commit comments

Comments
 (0)