From 61e9f51cf9cbe78ab195f1c71b912a4a4c701cc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Schreiner?= Date: Sat, 10 Jun 2023 20:57:55 +0200 Subject: [PATCH] broken --- Cargo.toml | 2 +- src/lib.rs | 1 + src/maybe_object.rs | 54 +++++++++++++++++++++++++++++++++++++++++ src/models/gamestate.rs | 19 +++++++++------ 4 files changed, 67 insertions(+), 9 deletions(-) create mode 100644 src/maybe_object.rs diff --git a/Cargo.toml b/Cargo.toml index c847b45..d87add0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,7 +18,7 @@ libdeflate = ["libdeflater/freestanding"] serialize = [] [dependencies] -jomini = { version = "0.21", features = ["json"] } +jomini = { git = "https://github.com/rakaly/jomini.git", branch = "deser", features = ["json"] } zip = { version = "0.6", default-features = false } serde = { version = "1", features = ["derive"] } thiserror = "1" diff --git a/src/lib.rs b/src/lib.rs index 0f39a87..a2d9096 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -52,6 +52,7 @@ mod header; mod melt; pub mod models; mod tokens; +mod maybe_object; pub use ck3date::*; pub use errors::*; diff --git a/src/maybe_object.rs b/src/maybe_object.rs new file mode 100644 index 0000000..48a1e46 --- /dev/null +++ b/src/maybe_object.rs @@ -0,0 +1,54 @@ +use std::fmt; +use std::marker::PhantomData; +use serde::{Deserialize, Deserializer, de, Serialize}; + +#[derive(Debug, Clone, PartialEq, Serialize)] +pub enum MaybeObject { + Text(String), + Object(T), +} + +impl<'de, T> Deserialize<'de> for MaybeObject +where + T: Deserialize<'de>, +{ + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + struct MaybeObjectVisitor { + marker: PhantomData, + } + + impl<'de, T1> de::Visitor<'de> for MaybeObjectVisitor + where + T1: Deserialize<'de>, + { + type Value = MaybeObject; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("an object or string") + } + + fn visit_str(self, v: &str) -> Result + where + E: de::Error, + { + Ok(MaybeObject::Text(String::from(v))) + } + + fn visit_map(self, map: A) -> Result + where + A: de::MapAccess<'de>, + { + let mvd = de::value::MapAccessDeserializer::new(map); + let result = T1::deserialize(mvd)?; + Ok(MaybeObject::Object(result)) + } + } + + deserializer.deserialize_map(MaybeObjectVisitor { + marker: PhantomData, + }) + } +} diff --git a/src/models/gamestate.rs b/src/models/gamestate.rs index 67384fe..afb570a 100644 --- a/src/models/gamestate.rs +++ b/src/models/gamestate.rs @@ -1,11 +1,13 @@ use std::collections::HashMap; -use super::MetadataOwned; -use crate::flavor::reencode_float; -use serde::{Deserialize, Deserializer, Serialize}; -use crate::Ck3Date; +use serde::{Deserialize, Deserializer, Serialize}; +use crate::{Ck3Date}; +use crate::flavor::reencode_float; +use crate::maybe_object::MaybeObject; + +use super::MetadataOwned; #[derive(Debug, Deserialize)] pub struct Gamestate { @@ -20,10 +22,11 @@ pub struct Gamestate { #[derive(Debug, Deserialize, Serialize, Clone)] pub struct Dynasties { - pub dynasty_house: HashMap, - pub dynasties: HashMap, + pub dynasty_house: HashMap>, + pub dynasties: HashMap>, } + #[derive(Debug, Deserialize, Serialize, Clone)] pub struct PlayedCharacter { pub name: String, @@ -33,7 +36,7 @@ pub struct PlayedCharacter { #[derive(Debug, Deserialize, Serialize, Clone)] pub struct DynastyHouse { pub name: Option, - pub dynasty: u64 + // pub dynasty: Option } #[derive(Debug, Deserialize, Serialize, Clone)] @@ -113,4 +116,4 @@ where pub (crate) fn default_false() -> bool { false -} \ No newline at end of file +}