@@ -1,5 +1,2 @@ | |||
pub mod cardlife; | |||
pub mod robocraft; | |||
#[cfg(test)] | |||
mod tests {} |
@@ -1,7 +1,7 @@ | |||
use reqwest::{Client, Error}; | |||
use url::{Url}; | |||
use crate::robocraft::{ITokenProvider, DefaultTokenProvider, FactoryInfo, FactorySearchBuilder}; | |||
use crate::robocraft::{ITokenProvider, DefaultTokenProvider, FactoryInfo, FactorySearchBuilder, RoboShopItemsInfo, FactoryRobotGetInfo}; | |||
use crate::robocraft::factory_json::ListPayload; | |||
const FACTORY_DOMAIN: &str = "https://factory.robocraftgame.com/"; | |||
@@ -26,7 +26,7 @@ impl FactoryAPI { | |||
} | |||
} | |||
pub async fn list(&self) -> Result<FactoryInfo, Error> { | |||
pub async fn list(&self) -> Result<FactoryInfo<RoboShopItemsInfo>, Error> { | |||
let url = Url::parse(FACTORY_DOMAIN) | |||
.unwrap() | |||
.join("/api/roboShopItems/list") | |||
@@ -39,7 +39,7 @@ impl FactoryAPI { | |||
} | |||
let result = request_builder.send().await; | |||
if let Ok(response) = result { | |||
return response.json::<FactoryInfo>().await; | |||
return response.json::<FactoryInfo<RoboShopItemsInfo>>().await; | |||
} | |||
Err(result.err().unwrap()) | |||
} | |||
@@ -56,4 +56,20 @@ impl FactoryAPI { | |||
let request_builder = self.client.post(url); | |||
FactorySearchBuilder::new(request_builder, token_opt) | |||
} | |||
pub async fn get(&self, item_id: usize) -> Result<FactoryInfo<FactoryRobotGetInfo>, Error> { | |||
let url = Url::parse(FACTORY_DOMAIN) | |||
.unwrap() | |||
.join(&format!("/api/roboShopItems/get/{}", item_id)) | |||
.unwrap(); | |||
let mut request_builder = self.client.get(url); | |||
if let Ok(token) = self.token.token() { | |||
request_builder = request_builder.header("Authorization", "Web ".to_owned() + &token); | |||
} | |||
let result = request_builder.send().await; | |||
if let Ok(response) = result { | |||
return response.json::<FactoryInfo<FactoryRobotGetInfo>>().await; | |||
} | |||
Err(result.err().unwrap()) | |||
} | |||
} |
@@ -1,5 +1,7 @@ | |||
use serde::{Deserialize, Serialize}; | |||
// list endpoint | |||
#[derive(Deserialize, Serialize, Clone)] | |||
pub(crate) struct ListPayload { | |||
#[serde(rename = "page")] | |||
@@ -81,9 +83,9 @@ impl ListPayload { | |||
} | |||
#[derive(Deserialize, Serialize, Clone)] | |||
pub struct FactoryInfo { | |||
pub struct FactoryInfo<T> { | |||
#[serde(rename = "response")] | |||
pub response: RoboShopItemsInfo, | |||
pub response: T, | |||
#[serde(rename = "statusCode")] | |||
pub status_code: usize, | |||
} | |||
@@ -143,3 +145,59 @@ impl std::string::ToString for FactoryRobotListInfo { | |||
format!("{} by {} ({})", &self.item_name, &self.added_by_display_name, &self.item_id) | |||
} | |||
} | |||
// get/<item_id> endpoint | |||
#[derive(Deserialize, Serialize, Clone)] | |||
pub struct FactoryRobotGetInfo { | |||
#[serde(rename = "id")] | |||
pub item_id: usize, | |||
#[serde(rename = "name")] | |||
pub item_name: String, | |||
#[serde(rename = "description")] | |||
pub item_description: String, | |||
#[serde(rename = "thumbnail")] | |||
pub thumbnail: String, // url | |||
#[serde(rename = "addedBy")] | |||
pub added_by: String, | |||
#[serde(rename = "addedByDisplayName")] | |||
pub added_by_display_name: String, | |||
#[serde(rename = "addedDate")] | |||
pub added_date: String, // ISO date | |||
#[serde(rename = "expiryDate")] | |||
pub expiry_date: String, // ISO date | |||
#[serde(rename = "cpu")] | |||
pub cpu: usize, | |||
#[serde(rename = "totalRobotRanking")] | |||
pub total_robot_ranking: usize, | |||
#[serde(rename = "rentCount")] | |||
pub rent_count: usize, | |||
#[serde(rename = "buyCount")] | |||
pub buy_count: usize, | |||
#[serde(rename = "buyable")] | |||
pub buyable: bool, | |||
#[serde(rename = "removedDate")] | |||
pub removed_date: Option<String>, | |||
#[serde(rename = "banDate")] | |||
pub ban_date: Option<String>, | |||
#[serde(rename = "featured")] | |||
pub featured: bool, | |||
#[serde(rename = "bannerMessage")] | |||
pub banner_message: Option<String>, | |||
#[serde(rename = "combatRating")] | |||
pub combat_rating: f32, | |||
#[serde(rename = "cosmeticRating")] | |||
pub cosmetic_rating: f32, | |||
#[serde(rename = "cubeData")] | |||
pub cube_data: String, | |||
#[serde(rename = "colourData")] | |||
pub colour_data: String, | |||
#[serde(rename = "cubeAmounts")] | |||
pub cube_amounts: String, // JSON as str | |||
} | |||
impl std::string::ToString for FactoryRobotGetInfo { | |||
fn to_string(&self) -> String { | |||
format!("{} by {} ({})", &self.item_name, &self.added_by_display_name, &self.item_id) | |||
} | |||
} |
@@ -1,6 +1,6 @@ | |||
use reqwest::{RequestBuilder, Error}; | |||
use crate::robocraft::{FactoryInfo}; | |||
use crate::robocraft::{FactoryInfo, RoboShopItemsInfo}; | |||
use crate::robocraft::factory_json::ListPayload; | |||
pub enum FactoryOrderType { | |||
@@ -156,14 +156,14 @@ impl FactorySearchBuilder { | |||
self | |||
} | |||
pub async fn send(mut self) -> Result<FactoryInfo, Error> { | |||
pub async fn send(mut self) -> Result<FactoryInfo<RoboShopItemsInfo>, Error> { | |||
self.reqwest_builder = self.reqwest_builder.json(&self.payload); | |||
if let Some(token) = self.token.clone() { | |||
self.reqwest_builder = self.reqwest_builder.header("Authorization", "Web ".to_owned() + &token); | |||
} | |||
let result = self.reqwest_builder.send().await; | |||
if let Ok(response) = result { | |||
return response.json::<FactoryInfo>().await; | |||
return response.json::<FactoryInfo<RoboShopItemsInfo>>().await; | |||
} | |||
Err(result.err().unwrap()) | |||
} | |||
@@ -2,7 +2,7 @@ mod factory; | |||
mod factory_json; | |||
mod factory_request_builder; | |||
pub use self::factory::{FactoryAPI}; | |||
pub use self::factory_json::{FactoryInfo, FactoryRobotListInfo, RoboShopItemsInfo}; | |||
pub use self::factory_json::{FactoryInfo, FactoryRobotListInfo, RoboShopItemsInfo, FactoryRobotGetInfo}; | |||
pub use self::factory_request_builder::{FactorySearchBuilder, FactoryMovementType, FactoryOrderType, FactoryWeaponType, FactoryTextSearchType}; | |||
mod auth; | |||
@@ -28,7 +28,7 @@ fn builder() -> robocraft::FactorySearchBuilder { | |||
robocraft::FactoryAPI::new().list_builder() | |||
} | |||
fn assert_factory_list(robo_info: robocraft::FactoryInfo) -> Result<(), ()> { | |||
fn assert_factory_list(robo_info: robocraft::FactoryInfo<robocraft::RoboShopItemsInfo>) -> Result<(), ()> { | |||
assert_ne!(robo_info.response.roboshop_items.len(), 0); | |||
assert_eq!(robo_info.status_code, 200); | |||
for robot in &robo_info.response.roboshop_items { | |||
@@ -76,3 +76,16 @@ async fn robocraft_factory_player_query() -> Result<(), ()> { | |||
assert!(result.is_ok()); | |||
assert_factory_list(result.unwrap()) | |||
} | |||
#[tokio::test] | |||
async fn robocraft_factory_robot_query() -> Result<(), ()> { | |||
let api = robocraft::FactoryAPI::new(); | |||
let result = api.get(6478345 /* featured robot id*/).await; | |||
assert!(result.is_ok()); | |||
let bot_info = result.unwrap(); | |||
assert_ne!(bot_info.response.item_name, ""); | |||
assert_eq!(bot_info.response.item_id, 6478345); | |||
assert_ne!(bot_info.response.cube_data, ""); | |||
assert_ne!(bot_info.response.colour_data, ""); | |||
Ok(()) | |||
} |