mirror of
https://codeberg.org/icewind/vdf-reader.git
synced 2026-06-03 18:14:07 +02:00
serde array value
This commit is contained in:
parent
d7d26f530a
commit
6643822671
5 changed files with 218 additions and 4 deletions
|
|
@ -7,6 +7,11 @@ use std::ops::{Deref, DerefMut};
|
||||||
#[serde(transparent)]
|
#[serde(transparent)]
|
||||||
pub struct Array(Vec<Entry>);
|
pub struct Array(Vec<Entry>);
|
||||||
|
|
||||||
|
impl From<Vec<Entry>> for Array {
|
||||||
|
fn from(value: Vec<Entry>) -> Self {
|
||||||
|
Array(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
impl From<Entry> for Array {
|
impl From<Entry> for Array {
|
||||||
fn from(value: Entry) -> Self {
|
fn from(value: Entry) -> Self {
|
||||||
Array(vec![value])
|
Array(vec![value])
|
||||||
|
|
|
||||||
|
|
@ -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 serde::{Deserialize, Deserializer, Serialize};
|
||||||
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6};
|
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6};
|
||||||
from_str!(for 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()))
|
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)
|
deserializer.deserialize_any(EntryVisitor)
|
||||||
|
|
@ -342,4 +355,18 @@ fn test_serde_entry() {
|
||||||
Entry::Table(hashmap! {"foo".into() => Entry::Value("bar".into())}.into()),
|
Entry::Table(hashmap! {"foo".into() => Entry::Value("bar".into())}.into()),
|
||||||
unwrap_err(crate::from_str(j))
|
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))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -192,9 +192,8 @@ fn test_serde(path: &str) {
|
||||||
|
|
||||||
#[test_case("tests/data/toplevel.vdf")]
|
#[test_case("tests/data/toplevel.vdf")]
|
||||||
#[test_case("tests/data/concrete.vmt")]
|
#[test_case("tests/data/concrete.vmt")]
|
||||||
// #[test_case("tests/data/messy.vdf")]
|
#[test_case("tests/data/DialogConfigOverlay_1280x720.vdf")]
|
||||||
// #[test_case("tests/data/DialogConfigOverlay_1280x720.vdf")]
|
#[test_case("tests/data/serde_array_type.vdf")]
|
||||||
// #[test_case("tests/data/serde_array_type.vdf")]
|
|
||||||
fn test_serde_table(path: &str) {
|
fn test_serde_table(path: &str) {
|
||||||
let raw = read_to_string(path).unwrap();
|
let raw = read_to_string(path).unwrap();
|
||||||
match from_str::<Table>(&raw) {
|
match from_str::<Table>(&raw) {
|
||||||
|
|
|
||||||
|
|
@ -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": {},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
@ -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",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue