use ureq::{Agent, Error, Response};
use url::Url;
use serde_json::{to_string};
use crate::robocraft::{ITokenProvider, DefaultTokenProvider, FACTORY_DOMAIN, FactoryInfo, RoboShopItemsInfo, FactoryRobotGetInfo};
use crate::robocraft::{ListPayload};
use crate::robocraft_simple::FactorySearchBuilder;
pub struct FactoryAPI {
client: Agent,
token: Box<dyn ITokenProvider>,
}
impl FactoryAPI {
pub fn new() -> FactoryAPI {
FactoryAPI {
client: Agent::new(),
token: Box::new(DefaultTokenProvider{}),
}
}
pub fn list(&self) -> Result<FactoryInfo<RoboShopItemsInfo>, 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.as_str())
.set("Content-Type", "application/json");
if let Ok(token) = self.token.token() {
request_builder = request_builder.set("Authorization", &("Web ".to_owned() + &token));
}
let result = request_builder.send_string(&to_string(&payload).unwrap());
if let Ok(response) = result {
let json_res = response.into_json::<FactoryInfo<RoboShopItemsInfo>>();
if let Ok(json) = json_res {
return Ok(json);
}
return Err(Error::Status(500, Response::new(500, "Malformed JSON", "").unwrap())); }
Err(result.err().unwrap())
}
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.as_str());
FactorySearchBuilder::new(request_builder, token_opt)
}
pub 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.as_str());
if let Ok(token) = self.token.token() {
request_builder = request_builder.set("Authorization", &("Web ".to_owned() + &token));
}
let result = request_builder.call();
if let Ok(response) = result {
let json_res = response.into_json::<FactoryInfo<FactoryRobotGetInfo>>();
if let Ok(json) = json_res {
return Ok(json);
}
return Err(Error::Status(500, Response::new(500, "Malformed JSON", "").unwrap())); }
Err(result.err().unwrap())
}
}