transparent entry serde

This commit is contained in:
Robin Appelman 2023-12-18 20:54:49 +01:00
commit 3d0ca31840
8 changed files with 132 additions and 128 deletions

View file

@ -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 {

View file

@ -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);

View file

@ -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 {

View file

@ -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>(

View file

@ -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 {

View file

@ -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": {},
}), },
}), },
}), },
}) }

View file

@ -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"),
}), },
}) }

View file

@ -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"),
}), },
}) }