diff --git a/torn-api/Cargo.toml b/torn-api/Cargo.toml index 5ed2222..8842698 100644 --- a/torn-api/Cargo.toml +++ b/torn-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "torn-api" -version = "0.6.2" +version = "0.6.3" edition = "2021" authors = ["Pyrit [2111649]"] license = "MIT" @@ -13,7 +13,7 @@ name = "deserialisation_benchmark" harness = false [features] -default = [ "reqwest", "user", "faction", "torn", "key" ] +default = [ "reqwest", "user", "faction", "torn", "key", "market" ] reqwest = [ "dep:reqwest" ] awc = [ "dep:awc" ] decimal = [ "dep:rust_decimal" ] @@ -21,6 +21,7 @@ decimal = [ "dep:rust_decimal" ] user = [ "__common" ] faction = [ "__common" ] torn = [ "__common" ] +market = [ "__common" ] key = [] __common = [] diff --git a/torn-api/src/lib.rs b/torn-api/src/lib.rs index 9f16c63..fd0bbec 100644 --- a/torn-api/src/lib.rs +++ b/torn-api/src/lib.rs @@ -10,6 +10,9 @@ pub mod user; #[cfg(feature = "faction")] pub mod faction; +#[cfg(feature = "market")] +pub mod market; + #[cfg(feature = "torn")] pub mod torn; diff --git a/torn-api/src/local.rs b/torn-api/src/local.rs index e4a1882..80e63a7 100644 --- a/torn-api/src/local.rs +++ b/torn-api/src/local.rs @@ -106,6 +106,46 @@ where .collect() } + #[cfg(feature = "market")] + pub async fn market(&self, build: F) -> Result + where + F: FnOnce( + crate::ApiRequestBuilder, + ) -> crate::ApiRequestBuilder, + { + let mut builder = crate::ApiRequestBuilder::default(); + builder = build(builder); + + self.executor + .execute(self.client, builder.request, builder.id) + .await + .map(crate::market::Response::from_response) + } + + #[cfg(feature = "market")] + pub async fn markets( + &self, + ids: L, + build: F, + ) -> HashMap> + where + F: FnOnce( + crate::ApiRequestBuilder, + ) -> crate::ApiRequestBuilder, + I: ToString + std::hash::Hash + std::cmp::Eq, + L: IntoIterator, + { + let mut builder = crate::ApiRequestBuilder::default(); + builder = build(builder); + + self.executor + .execute_many(self.client, builder.request, Vec::from_iter(ids)) + .await + .into_iter() + .map(|(k, v)| (k, v.map(crate::market::Response::from_response))) + .collect() + } + #[cfg(feature = "torn")] pub async fn torn(&self, build: F) -> Result where diff --git a/torn-api/src/market.rs b/torn-api/src/market.rs new file mode 100644 index 0000000..8db1a88 --- /dev/null +++ b/torn-api/src/market.rs @@ -0,0 +1,36 @@ +use serde::Deserialize; +use torn_api_macros::ApiCategory; + +#[derive(Debug, Clone, Copy, ApiCategory)] +#[api(category = "market")] +pub enum MarketSelection { + #[api(type = "Vec", field = "bazaar")] + Bazaar, +} + +#[derive(Clone, Debug, Deserialize)] +pub struct BazaarItem { + #[serde(rename = "ID")] + pub id: u32, + pub cost: u64, + pub quantity: u32, +} + +#[cfg(test)] +mod test { + use super::*; + use crate::tests::{async_test, setup, Client, ClientTrait}; + + #[async_test] + async fn market_bazaar() { + let key = setup(); + + let response = Client::default() + .torn_api(key) + .market(|b| b.id(1).selections([MarketSelection::Bazaar])) + .await + .unwrap(); + + _ = response.bazaar().unwrap(); + } +} diff --git a/torn-api/src/send.rs b/torn-api/src/send.rs index 3162016..9061c8c 100644 --- a/torn-api/src/send.rs +++ b/torn-api/src/send.rs @@ -106,6 +106,46 @@ where .collect() } + #[cfg(feature = "market")] + pub async fn market(&self, build: F) -> Result + where + F: FnOnce( + crate::ApiRequestBuilder, + ) -> crate::ApiRequestBuilder, + { + let mut builder = crate::ApiRequestBuilder::default(); + builder = build(builder); + + self.executor + .execute(self.client, builder.request, builder.id) + .await + .map(crate::market::Response::from_response) + } + + #[cfg(feature = "market")] + pub async fn markets( + &self, + ids: L, + build: F, + ) -> HashMap> + where + F: FnOnce( + crate::ApiRequestBuilder, + ) -> crate::ApiRequestBuilder, + I: ToString + std::hash::Hash + std::cmp::Eq + Send + Sync, + L: IntoIterator, + { + let mut builder = crate::ApiRequestBuilder::default(); + builder = build(builder); + + self.executor + .execute_many(self.client, builder.request, Vec::from_iter(ids)) + .await + .into_iter() + .map(|(k, v)| (k, v.map(crate::market::Response::from_response))) + .collect() + } + #[cfg(feature = "torn")] pub async fn torn(&self, build: F) -> Result where