serde array value

This commit is contained in:
Robin Appelman 2023-12-18 22:56:27 +01:00
commit 6643822671
5 changed files with 218 additions and 4 deletions

View file

@ -7,6 +7,11 @@ use std::ops::{Deref, DerefMut};
#[serde(transparent)]
pub struct Array(Vec<Entry>);
impl From<Vec<Entry>> for Array {
fn from(value: Vec<Entry>) -> Self {
Array(value)
}
}
impl From<Entry> for Array {
fn from(value: Entry) -> Self {
Array(vec![value])

View file

@ -177,7 +177,7 @@ macro_rules! from_str {
);
}
use serde::de::{Error, MapAccess, Visitor};
use serde::de::{Error, MapAccess, SeqAccess, Visitor};
use serde::{Deserialize, Deserializer, Serialize};
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6};
from_str!(for IpAddr Ipv4Addr Ipv6Addr SocketAddr SocketAddrV4 SocketAddrV6);
@ -311,6 +311,19 @@ impl<'de> Deserialize<'de> for Entry {
Ok(Entry::Table(res.into()))
}
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
where
A: SeqAccess<'v>,
{
let mut res = Vec::new();
while let Some(entry) = seq.next_element()? {
res.push(entry);
}
Ok(Entry::Array(res.into()))
}
}
deserializer.deserialize_any(EntryVisitor)
@ -342,4 +355,18 @@ fn test_serde_entry() {
Entry::Table(hashmap! {"foo".into() => Entry::Value("bar".into())}.into()),
unwrap_err(crate::from_str(j))
);
let j = r#""[1 2 3]""#;
assert_eq!(
Entry::Array(
vec![
Value::from("1").into(),
Value::from("2").into(),
Value::from("3").into()
]
.into()
),
unwrap_err(crate::from_str(j))
);
}

View file

@ -192,9 +192,8 @@ fn test_serde(path: &str) {
#[test_case("tests/data/toplevel.vdf")]
#[test_case("tests/data/concrete.vmt")]
// #[test_case("tests/data/messy.vdf")]
// #[test_case("tests/data/DialogConfigOverlay_1280x720.vdf")]
// #[test_case("tests/data/serde_array_type.vdf")]
#[test_case("tests/data/DialogConfigOverlay_1280x720.vdf")]
#[test_case("tests/data/serde_array_type.vdf")]
fn test_serde_table(path: &str) {
let raw = read_to_string(path).unwrap();
match from_str::<Table>(&raw) {

View file

@ -0,0 +1,155 @@
---
source: tests/serde.rs
expression: result
---
{
"UserConfigData": {
"FriendsMainDialog": {
"FriendPanelSelf": {},
"FriendsDialogSheet": {
"FriendsClansPage": {
"BuddyList": {
"0_collapsed": "0",
"1_collapsed": "0",
"2_collapsed": "0",
"3_collapsed": "0",
},
},
"FriendsFriendsPage": {
"BuddyList": {
"0_collapsed": "0",
"1_collapsed": "0",
"2_collapsed": "0",
"3_collapsed": "0",
"4_collapsed": "0",
"5_collapsed": "0",
"allfriends_collapsed": "0",
},
},
},
"FriendsState": {},
"tall": "440",
"wide": "252",
"xpos": "1028",
"ypos": "280",
},
"Servers": {
"DialogServerBrowser.res": {
"GameTabs": {
"FavoriteGames": {
"gamelist": {
"#ServerBrowser_Bots_hidden": "1",
"#ServerBrowser_Game_hidden": "0",
"#ServerBrowser_IPAddress_hidden": "1",
"#ServerBrowser_Latency_hidden": "0",
"#ServerBrowser_Map_hidden": "0",
"#ServerBrowser_Password_hidden": "0",
"#ServerBrowser_Players_hidden": "0",
"#ServerBrowser_Secure_hidden": "0",
"#ServerBrowser_Servers_hidden": "0",
"sort_column": "#ServerBrowser_Latency",
"sort_column_asc": "1",
"sort_column_secondary": "",
"sort_column_secondary_asc": "1",
},
},
"FriendsGames": {
"gamelist": {
"#ServerBrowser_Bots_hidden": "1",
"#ServerBrowser_Game_hidden": "0",
"#ServerBrowser_IPAddress_hidden": "1",
"#ServerBrowser_Latency_hidden": "0",
"#ServerBrowser_Map_hidden": "0",
"#ServerBrowser_Password_hidden": "0",
"#ServerBrowser_Players_hidden": "0",
"#ServerBrowser_Secure_hidden": "0",
"#ServerBrowser_Servers_hidden": "0",
"sort_column": "#ServerBrowser_Latency",
"sort_column_asc": "1",
"sort_column_secondary": "",
"sort_column_secondary_asc": "1",
},
},
"HistoryGames": {
"gamelist": {
"#ServerBrowser_Bots_hidden": "1",
"#ServerBrowser_Game_hidden": "0",
"#ServerBrowser_IPAddress_hidden": "1",
"#ServerBrowser_LastPlayed_hidden": "0",
"#ServerBrowser_Latency_hidden": "0",
"#ServerBrowser_Map_hidden": "0",
"#ServerBrowser_Password_hidden": "0",
"#ServerBrowser_Players_hidden": "0",
"#ServerBrowser_Secure_hidden": "0",
"#ServerBrowser_Servers_hidden": "0",
"sort_column": "#ServerBrowser_LastPlayed",
"sort_column_asc": "1",
"sort_column_secondary": "#ServerBrowser_Latency",
"sort_column_secondary_asc": "1",
},
},
"InternetGames": {
"gamelist": {
"#ServerBrowser_Bots_hidden": "1",
"#ServerBrowser_Game_hidden": "0",
"#ServerBrowser_IPAddress_hidden": "1",
"#ServerBrowser_Latency_hidden": "0",
"#ServerBrowser_Map_hidden": "0",
"#ServerBrowser_Password_hidden": "0",
"#ServerBrowser_Players_hidden": "0",
"#ServerBrowser_Secure_hidden": "0",
"#ServerBrowser_Servers_hidden": "0",
"sort_column": "#ServerBrowser_Latency",
"sort_column_asc": "1",
"sort_column_secondary": "",
"sort_column_secondary_asc": "1",
},
},
"LanGames": {
"gamelist": {
"#ServerBrowser_Bots_hidden": "1",
"#ServerBrowser_Game_hidden": "0",
"#ServerBrowser_IPAddress_hidden": "1",
"#ServerBrowser_Latency_hidden": "0",
"#ServerBrowser_Map_hidden": "0",
"#ServerBrowser_Password_hidden": "0",
"#ServerBrowser_Players_hidden": "0",
"#ServerBrowser_Secure_hidden": "0",
"#ServerBrowser_Servers_hidden": "0",
"sort_column": "#ServerBrowser_Latency",
"sort_column_asc": "1",
"sort_column_secondary": "",
"sort_column_secondary_asc": "1",
},
},
"SpectateGames": {
"gamelist": {
"#ServerBrowser_Bots_hidden": "1",
"#ServerBrowser_Game_hidden": "0",
"#ServerBrowser_IPAddress_hidden": "1",
"#ServerBrowser_Latency_hidden": "0",
"#ServerBrowser_Map_hidden": "0",
"#ServerBrowser_Password_hidden": "0",
"#ServerBrowser_Players_hidden": "0",
"#ServerBrowser_Secure_hidden": "0",
"#ServerBrowser_Servers_hidden": "0",
"sort_column": "#ServerBrowser_Latency",
"sort_column_asc": "1",
"sort_column_secondary": "",
"sort_column_secondary_asc": "1",
},
},
},
"tall": "720",
"wide": "1280",
"xpos": "0",
"ypos": "0",
},
},
"Steam": {
"cached": {
"OverlaySplash.res": {},
},
},
},
}

View file

@ -0,0 +1,28 @@
---
source: tests/serde.rs
expression: result
---
{
"Types": {
"fixed_array": [
"1",
"2",
"3",
],
"flex_array": [
"1",
"2.2",
],
"single": "1.2",
"single_int": "2",
"triple": [
"1.2",
"1.3",
"1.4",
],
"tuple": [
"1",
"57",
],
},
}