From 6b4189ab2d59f11d721581ead0782ef9223d3ca1 Mon Sep 17 00:00:00 2001 From: TotallyNot <44345987+TotallyNot@users.noreply.github.com> Date: Sat, 11 Mar 2023 19:21:08 +0100 Subject: [PATCH] fixed faction->territory for sectored factions --- .gitignore | 1 + torn-api/Cargo.toml | 2 +- torn-api/src/de_util.rs | 13 +++++++++++-- torn-api/src/faction.rs | 25 +++++++++++++++++++++++-- 4 files changed, 36 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index ffc3118..4bcb2ce 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /target /Cargo.lock .env +.DS_Store diff --git a/torn-api/Cargo.toml b/torn-api/Cargo.toml index be77d71..e66a5dd 100644 --- a/torn-api/Cargo.toml +++ b/torn-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "torn-api" -version = "0.5.14" +version = "0.5.15" edition = "2021" authors = ["Pyrit [2111649]"] license = "MIT" diff --git a/torn-api/src/de_util.rs b/torn-api/src/de_util.rs index 3e10aa4..0bf658c 100644 --- a/torn-api/src/de_util.rs +++ b/torn-api/src/de_util.rs @@ -1,8 +1,8 @@ #![allow(unused)] -use std::collections::BTreeMap; +use std::collections::{BTreeMap, HashMap}; -use chrono::{DateTime, NaiveDateTime, Utc}; +use chrono::{serde::ts_nanoseconds::deserialize, DateTime, NaiveDateTime, Utc}; use serde::de::{Deserialize, Deserializer, Error, Unexpected, Visitor}; pub(crate) fn empty_string_is_none<'de, D>(deserializer: D) -> Result, D::Error> @@ -182,6 +182,15 @@ where deserializer.deserialize_any(ArrayVisitor(std::marker::PhantomData)) } +pub(crate) fn null_is_empty_dict<'de, D, K, V>(deserializer: D) -> Result, D::Error> +where + D: Deserializer<'de>, + K: std::hash::Hash + std::cmp::Eq + Deserialize<'de>, + V: Deserialize<'de>, +{ + Ok(Option::deserialize(deserializer)?.unwrap_or_default()) +} + #[cfg(feature = "decimal")] pub(crate) fn string_or_decimal<'de, D>(deserializer: D) -> Result where diff --git a/torn-api/src/faction.rs b/torn-api/src/faction.rs index 8d11f6a..d4b611f 100644 --- a/torn-api/src/faction.rs +++ b/torn-api/src/faction.rs @@ -5,7 +5,7 @@ use serde::Deserialize; use torn_api_macros::ApiCategory; -use crate::de_util; +use crate::de_util::{self, null_is_empty_dict}; pub use crate::common::{LastAction, Status, Territory}; @@ -21,7 +21,11 @@ pub enum Selection { #[api(type = "BTreeMap", field = "attacks")] Attacks, - #[api(type = "HashMap", field = "territory")] + #[api( + type = "HashMap", + field = "territory", + with = "null_is_empty_dict" + )] Territory, } @@ -199,4 +203,21 @@ mod tests { response.attacks_full().unwrap(); response.territory().unwrap(); } + + #[async_test] + async fn destroyed_faction() { + let key = setup(); + + let response = Client::default() + .torn_api(key) + .faction(|b| { + b.id(8981) + .selections(&[Selection::Basic, Selection::Territory]) + }) + .await + .unwrap(); + + response.basic().unwrap(); + response.territory().unwrap(); + } }