use reqwest::{Client, Error}; use url::{Url}; use crate::robocraft::{ITokenProvider, DefaultTokenProvider, FactoryInfo, FactorySearchBuilder, RoboShopItemsInfo, FactoryRobotGetInfo}; use crate::robocraft::factory_json::ListPayload; /// Community Factory Robot root URL pub const FACTORY_DOMAIN: &str = "https://factory.robocraftgame.com/"; /// CRF API implementation pub struct FactoryAPI { client: Client, token: Box, } impl FactoryAPI { /// Create a new instance, using `DefaultTokenProvider`. pub fn new() -> FactoryAPI { FactoryAPI { client: Client::new(), token: Box::new(DefaultTokenProvider{}), } } /// Create a new instance using the provided token provider. pub fn with_auth(token_provider: Box) -> FactoryAPI { FactoryAPI { client: Client::new(), token: token_provider, } } /// Retrieve CRF robots on the main page. /// /// For searching, use `list_builder()` instead. pub async fn list(&self) -> Result, Error> { let url = Url::parse(FACTORY_DOMAIN) .unwrap() .join("/api/roboShopItems/list") .unwrap(); let payload = ListPayload::default(); let mut request_builder = self.client.post(url) .json(&payload); 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::>().await; } Err(result.err().unwrap()) } /// Build a CRF search query. /// /// This follows the builder pattern, so functions can be chained. pub fn list_builder(&self) -> FactorySearchBuilder { let url = Url::parse(FACTORY_DOMAIN) .unwrap() .join("/api/roboShopItems/list") .unwrap(); let mut token_opt = None; if let Ok(token) = self.token.token() { token_opt = Some(token); } let request_builder = self.client.post(url); FactorySearchBuilder::new(request_builder, token_opt) } /// Get in-depth info on a CRF robot. /// /// `item_id` corresponds to the field with the same name for FactoryRobotGetInfo and FactoryRobotListInfo. pub async fn get(&self, item_id: usize) -> Result, 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::>().await; } Err(result.err().unwrap()) } }