mirror of
https://codeberg.org/icewind/vdf-reader.git
synced 2026-06-03 18:14:07 +02:00
transparent entry serde
This commit is contained in:
parent
7d79e1e7bd
commit
3d0ca31840
8 changed files with 132 additions and 128 deletions
|
|
@ -1,9 +1,10 @@
|
||||||
use super::Entry;
|
use super::Entry;
|
||||||
use serde::Serialize;
|
use serde::{Deserialize, Serialize};
|
||||||
use std::ops::{Deref, DerefMut};
|
use std::ops::{Deref, DerefMut};
|
||||||
|
|
||||||
/// An array of entries (items that have the same key).
|
/// An array of entries (items that have the same key).
|
||||||
#[derive(Clone, PartialEq, Eq, Debug, Serialize)]
|
#[derive(Clone, PartialEq, Eq, Debug, Deserialize, Serialize)]
|
||||||
|
#[serde(transparent)]
|
||||||
pub struct Array(Vec<Entry>);
|
pub struct Array(Vec<Entry>);
|
||||||
|
|
||||||
impl From<Entry> for Array {
|
impl From<Entry> for Array {
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,8 @@ pub use table::Table;
|
||||||
pub use value::Value;
|
pub use value::Value;
|
||||||
|
|
||||||
/// The kinds of entry.
|
/// The kinds of entry.
|
||||||
#[derive(Clone, PartialEq, Eq, Debug, Serialize)]
|
#[derive(Clone, PartialEq, Eq, Debug, Deserialize, Serialize)]
|
||||||
|
#[serde(untagged)]
|
||||||
pub enum Entry {
|
pub enum Entry {
|
||||||
/// A table.
|
/// A table.
|
||||||
Table(Table),
|
Table(Table),
|
||||||
|
|
@ -174,7 +175,7 @@ macro_rules! from_str {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
use serde::Serialize;
|
use serde::{Deserialize, 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);
|
||||||
from_str!(for i8 i16 i32 i64 isize u8 u16 u32 u64 usize f32 f64);
|
from_str!(for i8 i16 i32 i64 isize u8 u16 u32 u64 usize f32 f64);
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,11 @@
|
||||||
use super::Entry;
|
use super::Entry;
|
||||||
use serde::Serialize;
|
use serde::{Deserialize, Serialize};
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
|
|
||||||
/// A statement.
|
/// A statement.
|
||||||
#[derive(Clone, PartialEq, Eq, Debug, Serialize)]
|
#[derive(Clone, PartialEq, Eq, Debug, Deserialize, Serialize)]
|
||||||
|
#[serde(transparent)]
|
||||||
pub struct Statement(String);
|
pub struct Statement(String);
|
||||||
|
|
||||||
impl From<Cow<'_, str>> for Statement {
|
impl From<Cow<'_, str>> for Statement {
|
||||||
|
|
|
||||||
|
|
@ -2,13 +2,14 @@ use super::{Array, Entry};
|
||||||
use crate::entry::{Statement, Value};
|
use crate::entry::{Statement, Value};
|
||||||
use crate::event::{EntryEvent, GroupStartEvent};
|
use crate::event::{EntryEvent, GroupStartEvent};
|
||||||
use crate::{Event, Item, Reader, Result};
|
use crate::{Event, Item, Reader, Result};
|
||||||
use serde::{Serialize, Serializer};
|
use serde::{Deserialize, Serialize, Serializer};
|
||||||
use std::collections::hash_map;
|
use std::collections::hash_map;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
|
|
||||||
/// A table of entries.
|
/// A table of entries.
|
||||||
#[derive(Clone, PartialEq, Eq, Debug, Serialize)]
|
#[derive(Clone, PartialEq, Eq, Debug, Deserialize, Serialize)]
|
||||||
|
#[serde(transparent)]
|
||||||
pub struct Table(#[serde(serialize_with = "ordered_map")] HashMap<String, Entry>);
|
pub struct Table(#[serde(serialize_with = "ordered_map")] HashMap<String, Entry>);
|
||||||
|
|
||||||
fn ordered_map<S, K: Ord + Serialize, V: Serialize>(
|
fn ordered_map<S, K: Ord + Serialize, V: Serialize>(
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
use super::Entry;
|
use super::Entry;
|
||||||
use serde::Serialize;
|
use serde::{Deserialize, Serialize};
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
|
|
||||||
#[derive(Clone, PartialEq, Eq, Debug, Serialize)]
|
#[derive(Clone, PartialEq, Eq, Debug, Deserialize, Serialize)]
|
||||||
pub struct Value(String);
|
pub struct Value(String);
|
||||||
|
|
||||||
impl From<Cow<'_, str>> for Value {
|
impl From<Cow<'_, str>> for Value {
|
||||||
|
|
|
||||||
|
|
@ -2,21 +2,21 @@
|
||||||
source: tests/parse.rs
|
source: tests/parse.rs
|
||||||
expression: parsed
|
expression: parsed
|
||||||
---
|
---
|
||||||
Table({
|
{
|
||||||
"UserConfigData": Table({
|
"UserConfigData": {
|
||||||
"FriendsMainDialog": Table({
|
"FriendsMainDialog": {
|
||||||
"FriendPanelSelf": Table({}),
|
"FriendPanelSelf": {},
|
||||||
"FriendsDialogSheet": Table({
|
"FriendsDialogSheet": {
|
||||||
"FriendsClansPage": Table({
|
"FriendsClansPage": {
|
||||||
"BuddyList": Table({
|
"BuddyList": {
|
||||||
"0_collapsed": Value("0"),
|
"0_collapsed": Value("0"),
|
||||||
"1_collapsed": Value("0"),
|
"1_collapsed": Value("0"),
|
||||||
"2_collapsed": Value("0"),
|
"2_collapsed": Value("0"),
|
||||||
"3_collapsed": Value("0"),
|
"3_collapsed": Value("0"),
|
||||||
}),
|
},
|
||||||
}),
|
},
|
||||||
"FriendsFriendsPage": Table({
|
"FriendsFriendsPage": {
|
||||||
"BuddyList": Table({
|
"BuddyList": {
|
||||||
"0_collapsed": Value("0"),
|
"0_collapsed": Value("0"),
|
||||||
"1_collapsed": Value("0"),
|
"1_collapsed": Value("0"),
|
||||||
"2_collapsed": Value("0"),
|
"2_collapsed": Value("0"),
|
||||||
|
|
@ -24,132 +24,132 @@ Table({
|
||||||
"4_collapsed": Value("0"),
|
"4_collapsed": Value("0"),
|
||||||
"5_collapsed": Value("0"),
|
"5_collapsed": Value("0"),
|
||||||
"allfriends_collapsed": Value("0"),
|
"allfriends_collapsed": Value("0"),
|
||||||
}),
|
},
|
||||||
}),
|
},
|
||||||
}),
|
},
|
||||||
"FriendsState": Table({}),
|
"FriendsState": {},
|
||||||
"tall": Value("440"),
|
"tall": Value("440"),
|
||||||
"wide": Value("252"),
|
"wide": Value("252"),
|
||||||
"xpos": Value("1028"),
|
"xpos": Value("1028"),
|
||||||
"ypos": Value("280"),
|
"ypos": Value("280"),
|
||||||
}),
|
},
|
||||||
"Servers": Table({
|
"Servers": {
|
||||||
"DialogServerBrowser.res": Table({
|
"DialogServerBrowser.res": {
|
||||||
"GameTabs": Table({
|
"GameTabs": {
|
||||||
"FavoriteGames": Table({
|
"FavoriteGames": {
|
||||||
"gamelist": Table({
|
"gamelist": {
|
||||||
"#ServerBrowser_Bots_hidden": Statement("1"),
|
"#ServerBrowser_Bots_hidden": "1",
|
||||||
"#ServerBrowser_Game_hidden": Statement("0"),
|
"#ServerBrowser_Game_hidden": "0",
|
||||||
"#ServerBrowser_IPAddress_hidden": Statement("1"),
|
"#ServerBrowser_IPAddress_hidden": "1",
|
||||||
"#ServerBrowser_Latency_hidden": Statement("0"),
|
"#ServerBrowser_Latency_hidden": "0",
|
||||||
"#ServerBrowser_Map_hidden": Statement("0"),
|
"#ServerBrowser_Map_hidden": "0",
|
||||||
"#ServerBrowser_Password_hidden": Statement("0"),
|
"#ServerBrowser_Password_hidden": "0",
|
||||||
"#ServerBrowser_Players_hidden": Statement("0"),
|
"#ServerBrowser_Players_hidden": "0",
|
||||||
"#ServerBrowser_Secure_hidden": Statement("0"),
|
"#ServerBrowser_Secure_hidden": "0",
|
||||||
"#ServerBrowser_Servers_hidden": Statement("0"),
|
"#ServerBrowser_Servers_hidden": "0",
|
||||||
"sort_column": Value("#ServerBrowser_Latency"),
|
"sort_column": Value("#ServerBrowser_Latency"),
|
||||||
"sort_column_asc": Value("1"),
|
"sort_column_asc": Value("1"),
|
||||||
"sort_column_secondary": Value(""),
|
"sort_column_secondary": Value(""),
|
||||||
"sort_column_secondary_asc": Value("1"),
|
"sort_column_secondary_asc": Value("1"),
|
||||||
}),
|
},
|
||||||
}),
|
},
|
||||||
"FriendsGames": Table({
|
"FriendsGames": {
|
||||||
"gamelist": Table({
|
"gamelist": {
|
||||||
"#ServerBrowser_Bots_hidden": Statement("1"),
|
"#ServerBrowser_Bots_hidden": "1",
|
||||||
"#ServerBrowser_Game_hidden": Statement("0"),
|
"#ServerBrowser_Game_hidden": "0",
|
||||||
"#ServerBrowser_IPAddress_hidden": Statement("1"),
|
"#ServerBrowser_IPAddress_hidden": "1",
|
||||||
"#ServerBrowser_Latency_hidden": Statement("0"),
|
"#ServerBrowser_Latency_hidden": "0",
|
||||||
"#ServerBrowser_Map_hidden": Statement("0"),
|
"#ServerBrowser_Map_hidden": "0",
|
||||||
"#ServerBrowser_Password_hidden": Statement("0"),
|
"#ServerBrowser_Password_hidden": "0",
|
||||||
"#ServerBrowser_Players_hidden": Statement("0"),
|
"#ServerBrowser_Players_hidden": "0",
|
||||||
"#ServerBrowser_Secure_hidden": Statement("0"),
|
"#ServerBrowser_Secure_hidden": "0",
|
||||||
"#ServerBrowser_Servers_hidden": Statement("0"),
|
"#ServerBrowser_Servers_hidden": "0",
|
||||||
"sort_column": Value("#ServerBrowser_Latency"),
|
"sort_column": Value("#ServerBrowser_Latency"),
|
||||||
"sort_column_asc": Value("1"),
|
"sort_column_asc": Value("1"),
|
||||||
"sort_column_secondary": Value(""),
|
"sort_column_secondary": Value(""),
|
||||||
"sort_column_secondary_asc": Value("1"),
|
"sort_column_secondary_asc": Value("1"),
|
||||||
}),
|
},
|
||||||
}),
|
},
|
||||||
"HistoryGames": Table({
|
"HistoryGames": {
|
||||||
"gamelist": Table({
|
"gamelist": {
|
||||||
"#ServerBrowser_Bots_hidden": Statement("1"),
|
"#ServerBrowser_Bots_hidden": "1",
|
||||||
"#ServerBrowser_Game_hidden": Statement("0"),
|
"#ServerBrowser_Game_hidden": "0",
|
||||||
"#ServerBrowser_IPAddress_hidden": Statement("1"),
|
"#ServerBrowser_IPAddress_hidden": "1",
|
||||||
"#ServerBrowser_LastPlayed_hidden": Statement("0"),
|
"#ServerBrowser_LastPlayed_hidden": "0",
|
||||||
"#ServerBrowser_Latency_hidden": Statement("0"),
|
"#ServerBrowser_Latency_hidden": "0",
|
||||||
"#ServerBrowser_Map_hidden": Statement("0"),
|
"#ServerBrowser_Map_hidden": "0",
|
||||||
"#ServerBrowser_Password_hidden": Statement("0"),
|
"#ServerBrowser_Password_hidden": "0",
|
||||||
"#ServerBrowser_Players_hidden": Statement("0"),
|
"#ServerBrowser_Players_hidden": "0",
|
||||||
"#ServerBrowser_Secure_hidden": Statement("0"),
|
"#ServerBrowser_Secure_hidden": "0",
|
||||||
"#ServerBrowser_Servers_hidden": Statement("0"),
|
"#ServerBrowser_Servers_hidden": "0",
|
||||||
"sort_column": Value("#ServerBrowser_LastPlayed"),
|
"sort_column": Value("#ServerBrowser_LastPlayed"),
|
||||||
"sort_column_asc": Value("1"),
|
"sort_column_asc": Value("1"),
|
||||||
"sort_column_secondary": Value("#ServerBrowser_Latency"),
|
"sort_column_secondary": Value("#ServerBrowser_Latency"),
|
||||||
"sort_column_secondary_asc": Value("1"),
|
"sort_column_secondary_asc": Value("1"),
|
||||||
}),
|
},
|
||||||
}),
|
},
|
||||||
"InternetGames": Table({
|
"InternetGames": {
|
||||||
"gamelist": Table({
|
"gamelist": {
|
||||||
"#ServerBrowser_Bots_hidden": Statement("1"),
|
"#ServerBrowser_Bots_hidden": "1",
|
||||||
"#ServerBrowser_Game_hidden": Statement("0"),
|
"#ServerBrowser_Game_hidden": "0",
|
||||||
"#ServerBrowser_IPAddress_hidden": Statement("1"),
|
"#ServerBrowser_IPAddress_hidden": "1",
|
||||||
"#ServerBrowser_Latency_hidden": Statement("0"),
|
"#ServerBrowser_Latency_hidden": "0",
|
||||||
"#ServerBrowser_Map_hidden": Statement("0"),
|
"#ServerBrowser_Map_hidden": "0",
|
||||||
"#ServerBrowser_Password_hidden": Statement("0"),
|
"#ServerBrowser_Password_hidden": "0",
|
||||||
"#ServerBrowser_Players_hidden": Statement("0"),
|
"#ServerBrowser_Players_hidden": "0",
|
||||||
"#ServerBrowser_Secure_hidden": Statement("0"),
|
"#ServerBrowser_Secure_hidden": "0",
|
||||||
"#ServerBrowser_Servers_hidden": Statement("0"),
|
"#ServerBrowser_Servers_hidden": "0",
|
||||||
"sort_column": Value("#ServerBrowser_Latency"),
|
"sort_column": Value("#ServerBrowser_Latency"),
|
||||||
"sort_column_asc": Value("1"),
|
"sort_column_asc": Value("1"),
|
||||||
"sort_column_secondary": Value(""),
|
"sort_column_secondary": Value(""),
|
||||||
"sort_column_secondary_asc": Value("1"),
|
"sort_column_secondary_asc": Value("1"),
|
||||||
}),
|
},
|
||||||
}),
|
},
|
||||||
"LanGames": Table({
|
"LanGames": {
|
||||||
"gamelist": Table({
|
"gamelist": {
|
||||||
"#ServerBrowser_Bots_hidden": Statement("1"),
|
"#ServerBrowser_Bots_hidden": "1",
|
||||||
"#ServerBrowser_Game_hidden": Statement("0"),
|
"#ServerBrowser_Game_hidden": "0",
|
||||||
"#ServerBrowser_IPAddress_hidden": Statement("1"),
|
"#ServerBrowser_IPAddress_hidden": "1",
|
||||||
"#ServerBrowser_Latency_hidden": Statement("0"),
|
"#ServerBrowser_Latency_hidden": "0",
|
||||||
"#ServerBrowser_Map_hidden": Statement("0"),
|
"#ServerBrowser_Map_hidden": "0",
|
||||||
"#ServerBrowser_Password_hidden": Statement("0"),
|
"#ServerBrowser_Password_hidden": "0",
|
||||||
"#ServerBrowser_Players_hidden": Statement("0"),
|
"#ServerBrowser_Players_hidden": "0",
|
||||||
"#ServerBrowser_Secure_hidden": Statement("0"),
|
"#ServerBrowser_Secure_hidden": "0",
|
||||||
"#ServerBrowser_Servers_hidden": Statement("0"),
|
"#ServerBrowser_Servers_hidden": "0",
|
||||||
"sort_column": Value("#ServerBrowser_Latency"),
|
"sort_column": Value("#ServerBrowser_Latency"),
|
||||||
"sort_column_asc": Value("1"),
|
"sort_column_asc": Value("1"),
|
||||||
"sort_column_secondary": Value(""),
|
"sort_column_secondary": Value(""),
|
||||||
"sort_column_secondary_asc": Value("1"),
|
"sort_column_secondary_asc": Value("1"),
|
||||||
}),
|
},
|
||||||
}),
|
},
|
||||||
"SpectateGames": Table({
|
"SpectateGames": {
|
||||||
"gamelist": Table({
|
"gamelist": {
|
||||||
"#ServerBrowser_Bots_hidden": Statement("1"),
|
"#ServerBrowser_Bots_hidden": "1",
|
||||||
"#ServerBrowser_Game_hidden": Statement("0"),
|
"#ServerBrowser_Game_hidden": "0",
|
||||||
"#ServerBrowser_IPAddress_hidden": Statement("1"),
|
"#ServerBrowser_IPAddress_hidden": "1",
|
||||||
"#ServerBrowser_Latency_hidden": Statement("0"),
|
"#ServerBrowser_Latency_hidden": "0",
|
||||||
"#ServerBrowser_Map_hidden": Statement("0"),
|
"#ServerBrowser_Map_hidden": "0",
|
||||||
"#ServerBrowser_Password_hidden": Statement("0"),
|
"#ServerBrowser_Password_hidden": "0",
|
||||||
"#ServerBrowser_Players_hidden": Statement("0"),
|
"#ServerBrowser_Players_hidden": "0",
|
||||||
"#ServerBrowser_Secure_hidden": Statement("0"),
|
"#ServerBrowser_Secure_hidden": "0",
|
||||||
"#ServerBrowser_Servers_hidden": Statement("0"),
|
"#ServerBrowser_Servers_hidden": "0",
|
||||||
"sort_column": Value("#ServerBrowser_Latency"),
|
"sort_column": Value("#ServerBrowser_Latency"),
|
||||||
"sort_column_asc": Value("1"),
|
"sort_column_asc": Value("1"),
|
||||||
"sort_column_secondary": Value(""),
|
"sort_column_secondary": Value(""),
|
||||||
"sort_column_secondary_asc": Value("1"),
|
"sort_column_secondary_asc": Value("1"),
|
||||||
}),
|
},
|
||||||
}),
|
},
|
||||||
}),
|
},
|
||||||
"tall": Value("720"),
|
"tall": Value("720"),
|
||||||
"wide": Value("1280"),
|
"wide": Value("1280"),
|
||||||
"xpos": Value("0"),
|
"xpos": Value("0"),
|
||||||
"ypos": Value("0"),
|
"ypos": Value("0"),
|
||||||
}),
|
},
|
||||||
}),
|
},
|
||||||
"Steam": Table({
|
"Steam": {
|
||||||
"cached": Table({
|
"cached": {
|
||||||
"OverlaySplash.res": Table({}),
|
"OverlaySplash.res": {},
|
||||||
}),
|
},
|
||||||
}),
|
},
|
||||||
}),
|
},
|
||||||
})
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,8 @@
|
||||||
source: tests/parse.rs
|
source: tests/parse.rs
|
||||||
expression: parsed
|
expression: parsed
|
||||||
---
|
---
|
||||||
Table({
|
{
|
||||||
"LightmappedGeneric": Table({
|
"LightmappedGeneric": {
|
||||||
"$baseTexture": Value("cp_mountainlab/concrete/concretefloor003"),
|
"$baseTexture": Value("cp_mountainlab/concrete/concretefloor003"),
|
||||||
"$bumpmap": Value("concrete/concretefloor007b_height-ssbump"),
|
"$bumpmap": Value("concrete/concretefloor007b_height-ssbump"),
|
||||||
"$detail": Value("overlays/detail001"),
|
"$detail": Value("overlays/detail001"),
|
||||||
|
|
@ -12,5 +12,5 @@ Table({
|
||||||
"$detailscale": Value("1.9"),
|
"$detailscale": Value("1.9"),
|
||||||
"$ssbump": Value("1"),
|
"$ssbump": Value("1"),
|
||||||
"%keywords": Value("tf"),
|
"%keywords": Value("tf"),
|
||||||
}),
|
},
|
||||||
})
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,18 +2,18 @@
|
||||||
source: tests/parse.rs
|
source: tests/parse.rs
|
||||||
expression: parsed
|
expression: parsed
|
||||||
---
|
---
|
||||||
Table({
|
{
|
||||||
"Resource/specificPanel.res": Table({
|
"Resource/specificPanel.res": {
|
||||||
"$envmaptint": Value(".5"),
|
"$envmaptint": Value(".5"),
|
||||||
".5": Value(".5"),
|
".5": Value(".5"),
|
||||||
"\\\\\"$translucent\"": Value("1"),
|
"\\\\\"$translucent\"": Value("1"),
|
||||||
"array": Array([
|
"array": [
|
||||||
Value("1"),
|
Value("1"),
|
||||||
Value("2"),
|
Value("2"),
|
||||||
Value("3"),
|
Value("3"),
|
||||||
]),
|
],
|
||||||
"empty": Value(""),
|
"empty": Value(""),
|
||||||
"empty quoted": Value("\"\""),
|
"empty quoted": Value("\"\""),
|
||||||
"windows_path": Value("C:\\test\\no newline"),
|
"windows_path": Value("C:\\test\\no newline"),
|
||||||
}),
|
},
|
||||||
})
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue