From 700cf8283ec02d4378d74541040dac545f46df87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Schreiner?= Date: Fri, 26 May 2023 21:22:39 +0200 Subject: [PATCH 1/5] Add provinces, dynasties, religions, holdings and expand alive data --- src/models/gamestate.rs | 84 +++++++++++++++++++++++++++++++++++++++-- src/models/header.rs | 1 + 2 files changed, 82 insertions(+), 3 deletions(-) diff --git a/src/models/gamestate.rs b/src/models/gamestate.rs index 1e33d0f..8de0c86 100644 --- a/src/models/gamestate.rs +++ b/src/models/gamestate.rs @@ -1,17 +1,71 @@ -use super::MetadataOwned; -use crate::flavor::reencode_float; -use serde::{Deserialize, Deserializer}; use std::collections::HashMap; +use serde::{Deserialize, Deserializer}; + +use crate::Ck3Date; +use crate::flavor::reencode_float; + +use super::MetadataOwned; + #[derive(Debug, Deserialize)] pub struct Gamestate { pub meta_data: MetadataOwned, pub living: HashMap, + pub provinces: HashMap, + pub traits_lookup: Vec, + pub dynasties: Dynasties, + pub religion: Religions, +} + +#[derive(Debug, Deserialize)] +pub struct Dynasties { + pub dynasty_house: HashMap, + pub dynasties: HashMap +} + +#[derive(Debug, Deserialize)] +pub struct DynastyHouse { + pub name: Option, + pub dynasty: u64 +} + +#[derive(Debug, Deserialize)] +pub struct Dynasty { + pub key: Option, +} + +#[derive(Debug, Deserialize)] +pub struct Province { + pub holding: Holding, + pub fort_level: Option, +} + +#[derive(Debug, Deserialize)] +pub struct Holding { + pub r#type: Option, + pub buildings: Vec, + pub levy: Option, + pub garrison: Option, + pub income: Option } +#[derive(Debug, Deserialize)] +pub struct Building { + pub r#type: Option +} + + #[derive(Debug, Deserialize)] pub struct LivingCharacter { pub alive_data: Option, + pub first_name: Option, + pub dynasty_house: Option, + pub birth: Option, + #[serde(default = "default_false")] + pub female: bool, + pub traits: Option>, + pub skill: Vec, + pub faith: Option } #[derive(Debug, Deserialize)] @@ -20,6 +74,26 @@ pub struct AliveData { pub gold: Option, pub health: Option, pub income: Option, + pub fertility: Option, + pub faith: Option +} + +#[derive(Debug, Deserialize)] +pub struct Religions { + pub religions: HashMap, + pub faiths: HashMap +} + +#[derive(Debug, Deserialize)] +pub struct Religion { + pub tag: String, + pub family: String +} + +#[derive(Debug, Deserialize)] +pub struct Faith { + pub tag: String, + pub religion: u64 } pub(crate) fn deserialize_eu4_float<'de, D>(deserializer: D) -> Result, D::Error> @@ -29,3 +103,7 @@ where let val: Option = Option::deserialize(deserializer)?; val.map(reencode_float).map(Ok).transpose() } + +pub (crate) fn default_false() -> bool { + false +} \ No newline at end of file diff --git a/src/models/header.rs b/src/models/header.rs index 9034e30..24d407b 100644 --- a/src/models/header.rs +++ b/src/models/header.rs @@ -15,6 +15,7 @@ pub struct HeaderBorrowed<'a> { #[derive(Debug, Deserialize)] pub struct MetadataOwned { pub version: String, + pub meta_player_name: String } #[derive(Debug, Deserialize)] From 13f50a3b346531a6817fc062f12ee163ac956679 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Schreiner?= Date: Sat, 27 May 2023 19:07:20 +0200 Subject: [PATCH 2/5] add played character --- src/bin/debug_save.rs | 3 ++- src/models/gamestate.rs | 16 ++++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/bin/debug_save.rs b/src/bin/debug_save.rs index 754dc97..affa91b 100644 --- a/src/bin/debug_save.rs +++ b/src/bin/debug_save.rs @@ -9,6 +9,7 @@ fn main() -> Result<(), Box> { let mut zip_sink = Vec::new(); let file = file.parse(&mut zip_sink)?; let save: Gamestate = file.deserializer(&EnvTokens).deserialize()?; - print!("{:#?}", save.meta_data.version); + println!("{:#?}", save.meta_data.version); + println!("{:#?}", save.played_character.character); Ok(()) } diff --git a/src/models/gamestate.rs b/src/models/gamestate.rs index 8de0c86..cd64dac 100644 --- a/src/models/gamestate.rs +++ b/src/models/gamestate.rs @@ -1,11 +1,11 @@ use std::collections::HashMap; +use super::MetadataOwned; +use crate::flavor::reencode_float; +use serde::{Deserialize, Deserializer, Serialize}; -use serde::{Deserialize, Deserializer}; use crate::Ck3Date; -use crate::flavor::reencode_float; -use super::MetadataOwned; #[derive(Debug, Deserialize)] pub struct Gamestate { @@ -21,6 +21,13 @@ pub struct Gamestate { pub struct Dynasties { pub dynasty_house: HashMap, pub dynasties: HashMap + pub played_character: PlayedCharacter, +} + +#[derive(Debug, Deserialize, Serialize, Clone)] +pub struct PlayedCharacter { + pub name: String, + pub character: u64 } #[derive(Debug, Deserialize)] @@ -56,6 +63,7 @@ pub struct Building { #[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, Serialize)] pub struct LivingCharacter { pub alive_data: Option, pub first_name: Option, @@ -68,7 +76,7 @@ pub struct LivingCharacter { pub faith: Option } -#[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, Serialize)] pub struct AliveData { #[serde(default, deserialize_with = "deserialize_eu4_float")] pub gold: Option, From 792faeb94eb766bfb8d8da6a66ceae8fd971f677 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Schreiner?= Date: Tue, 30 May 2023 09:52:02 +0200 Subject: [PATCH 3/5] add played character, fix traits --- src/bin/debug_save.rs | 19 +++++++++++++++++++ src/models/gamestate.rs | 27 +++++++++++++-------------- 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/bin/debug_save.rs b/src/bin/debug_save.rs index affa91b..4e1fcab 100644 --- a/src/bin/debug_save.rs +++ b/src/bin/debug_save.rs @@ -11,5 +11,24 @@ fn main() -> Result<(), Box> { let save: Gamestate = file.deserializer(&EnvTokens).deserialize()?; println!("{:#?}", save.meta_data.version); println!("{:#?}", save.played_character.character); + println!("{:#?}", save.living.get(&save.played_character.character)); + let traits = save + .living + .get(&save.played_character.character) + .unwrap() + .traits + .clone() + .unwrap(); + let trait_strings = traits + .iter() + .map(|t| save.traits_lookup[*t].clone()) + .collect::>(); + println!( + "{:#?}", + traits + .iter() + .map(|t| save.traits_lookup[*t].clone()) + .collect::>() + ); Ok(()) } diff --git a/src/models/gamestate.rs b/src/models/gamestate.rs index cd64dac..67384fe 100644 --- a/src/models/gamestate.rs +++ b/src/models/gamestate.rs @@ -15,13 +15,13 @@ pub struct Gamestate { pub traits_lookup: Vec, pub dynasties: Dynasties, pub religion: Religions, + pub played_character: PlayedCharacter, } -#[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, Serialize, Clone)] pub struct Dynasties { pub dynasty_house: HashMap, - pub dynasties: HashMap - pub played_character: PlayedCharacter, + pub dynasties: HashMap, } #[derive(Debug, Deserialize, Serialize, Clone)] @@ -30,24 +30,24 @@ pub struct PlayedCharacter { pub character: u64 } -#[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, Serialize, Clone)] pub struct DynastyHouse { pub name: Option, pub dynasty: u64 } -#[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, Serialize, Clone)] pub struct Dynasty { pub key: Option, } -#[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, Serialize)] pub struct Province { pub holding: Holding, pub fort_level: Option, } -#[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, Serialize)] pub struct Holding { pub r#type: Option, pub buildings: Vec, @@ -56,22 +56,21 @@ pub struct Holding { pub income: Option } -#[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, Serialize)] pub struct Building { pub r#type: Option } -#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize, Serialize)] pub struct LivingCharacter { pub alive_data: Option, - pub first_name: Option, + pub first_name: String, pub dynasty_house: Option, pub birth: Option, #[serde(default = "default_false")] pub female: bool, - pub traits: Option>, + pub traits: Option>, pub skill: Vec, pub faith: Option } @@ -86,19 +85,19 @@ pub struct AliveData { pub faith: Option } -#[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, Serialize)] pub struct Religions { pub religions: HashMap, pub faiths: HashMap } -#[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, Serialize)] pub struct Religion { pub tag: String, pub family: String } -#[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, Serialize)] pub struct Faith { pub tag: String, pub religion: u64 From 3d72d220b4023d91c8e301c0e935b3f41cfb13f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Schreiner?= Date: Wed, 7 Jun 2023 09:52:28 +0200 Subject: [PATCH 4/5] wip: add debug --- Cargo.toml | 1 + src/bin/debug_save.rs | 54 +++++++++++++++++++++++++------------------ 2 files changed, 33 insertions(+), 22 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 99a8f8d..c847b45 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,6 +24,7 @@ serde = { version = "1", features = ["derive"] } thiserror = "1" libdeflater = { version = "0.11", optional = true } miniz_oxide = { version = "0.6", optional = true } +serde_path_to_error = "0.1.11" [dev-dependencies] attohttpc = "0.23" diff --git a/src/bin/debug_save.rs b/src/bin/debug_save.rs index 4e1fcab..07c21dc 100644 --- a/src/bin/debug_save.rs +++ b/src/bin/debug_save.rs @@ -1,6 +1,7 @@ use std::env; use ck3save::{models::Gamestate, Ck3File, EnvTokens}; +use serde::Deserialize; fn main() -> Result<(), Box> { let args: Vec = env::args().collect(); @@ -8,27 +9,36 @@ fn main() -> Result<(), Box> { let file = Ck3File::from_slice(&data)?; let mut zip_sink = Vec::new(); let file = file.parse(&mut zip_sink)?; - let save: Gamestate = file.deserializer(&EnvTokens).deserialize()?; - println!("{:#?}", save.meta_data.version); - println!("{:#?}", save.played_character.character); - println!("{:#?}", save.living.get(&save.played_character.character)); - let traits = save - .living - .get(&save.played_character.character) - .unwrap() - .traits - .clone() - .unwrap(); - let trait_strings = traits - .iter() - .map(|t| save.traits_lookup[*t].clone()) - .collect::>(); - println!( - "{:#?}", - traits - .iter() - .map(|t| save.traits_lookup[*t].clone()) - .collect::>() - ); + let deserializer = file.deserializer(&EnvTokens); + let result: Result = serde_path_to_error::deserialize(deserializer); + match result { + Ok(_) => panic!("expected a type error"), + Err(err) => { + let path = err.path().to_string(); + assert_eq!(path, "dependencies.serde.version"); + } + } + // let save: Gamestate = deserializer.deserialize()?; + // println!("{:#?}", save.meta_data.version); + // println!("{:#?}", save.played_character.character); + // println!("{:#?}", save.living.get(&save.played_character.character)); + // let traits = save + // .living + // .get(&save.played_character.character) + // .unwrap() + // .traits + // .clone() + // .unwrap(); + // let trait_strings = traits + // .iter() + // .map(|t| save.traits_lookup[*t].clone()) + // .collect::>(); + // println!( + // "{:#?}", + // traits + // .iter() + // .map(|t| save.traits_lookup[*t].clone()) + // .collect::>() + // ); Ok(()) } 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 5/5] 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 +}