An unofficial collection of APIs used in FreeJam games and mods
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

132 lines
4.3KB

  1. use ureq::{Request, Response, Error};
  2. use crate::robocraft::{FactoryInfo, RoboShopItemsInfo, FactoryTextSearchType, FactoryWeaponType, FactoryMovementType, FactoryOrderType};
  3. use crate::robocraft::{ListPayload};
  4. pub struct FactorySearchBuilder {
  5. reqwest_builder: Request,
  6. payload: ListPayload,
  7. token: Option<String>,
  8. }
  9. impl FactorySearchBuilder {
  10. pub(crate) fn new(request_builder: Request, token: Option<String>) -> FactorySearchBuilder {
  11. FactorySearchBuilder {
  12. reqwest_builder: request_builder.set("Content-Type", "application/json"),
  13. payload: ListPayload::empty(),
  14. token,
  15. }
  16. }
  17. pub fn page(mut self, page_number: isize) -> Self {
  18. self.payload.page = page_number;
  19. self
  20. }
  21. pub fn items_per_page(mut self, page_size: isize) -> Self {
  22. self.payload.page_size = page_size;
  23. self
  24. }
  25. pub fn order(mut self, order_type: FactoryOrderType) -> Self {
  26. self.payload.order = order_type as isize;
  27. self
  28. }
  29. /* // this appears to not do anything (removed to prevent confusion)
  30. // use text_search_type(FactoryTextSearchType::Player) instead
  31. pub fn players_only(mut self, p: bool) -> Self {
  32. self.payload.player_filter = p;
  33. self
  34. }
  35. */
  36. pub fn movement_or(mut self, movement_type: FactoryMovementType) -> Self {
  37. if self.payload.movement_filter == "" {
  38. self.payload.movement_filter = format!("{},{}", &self.payload.movement_filter, movement_type as isize);
  39. } else {
  40. self.payload.movement_filter = (movement_type as isize).to_string();
  41. }
  42. self.payload.movement_category_filter = self.payload.movement_filter.clone();
  43. self
  44. }
  45. pub fn weapon_or(mut self, weapon_type: FactoryWeaponType) -> Self {
  46. if self.payload.weapon_filter == "" {
  47. self.payload.weapon_filter = format!("{},{}", &self.payload.weapon_filter, weapon_type as isize);
  48. } else {
  49. self.payload.weapon_filter = (weapon_type as isize).to_string();
  50. }
  51. self.payload.weapon_category_filter = self.payload.weapon_filter.clone();
  52. self
  53. }
  54. pub fn cpu_range(mut self, min: isize, max: isize) -> Self {
  55. self.payload.minimum_cpu = min;
  56. self.payload.maximum_cpu = max;
  57. self
  58. }
  59. pub fn min_cpu(mut self, min: isize) -> Self {
  60. self.payload.minimum_cpu = min;
  61. self
  62. }
  63. pub fn max_cpu(mut self, max: isize) -> Self {
  64. self.payload.maximum_cpu = max;
  65. self
  66. }
  67. pub fn no_minimum_cpu(mut self) -> Self {
  68. self.payload.minimum_cpu = -1;
  69. self
  70. }
  71. pub fn no_maximum_cpu(mut self) -> Self {
  72. self.payload.maximum_cpu = -1;
  73. self
  74. }
  75. pub fn text(mut self, t: String) -> Self {
  76. self.payload.text_filter = t;
  77. self
  78. }
  79. pub fn text_search_type(mut self, search_type: FactoryTextSearchType) -> Self {
  80. self.payload.text_search_field = search_type as isize;
  81. self
  82. }
  83. // setting buyable to false while using the default token provider will cause HTTP status 500 error
  84. pub fn buyable(mut self, b: bool) -> Self {
  85. self.payload.buyable = b;
  86. self
  87. }
  88. pub fn prepend_featured(mut self, b: bool) -> Self {
  89. self.payload.prepend_featured_robot = b;
  90. self
  91. }
  92. pub fn default_page(mut self, b: bool) -> Self {
  93. self.payload.default_page = b;
  94. self
  95. }
  96. pub fn send(mut self) -> Result<FactoryInfo<RoboShopItemsInfo>, Error> {
  97. self.reqwest_builder = self.reqwest_builder;
  98. if let Some(token) = self.token.clone() {
  99. self.reqwest_builder = self.reqwest_builder.set("Authorization", &("Web ".to_owned() + &token));
  100. }
  101. let result = self.reqwest_builder.send_string(&serde_json::to_string(&self.payload).unwrap());
  102. if let Ok(response) = result {
  103. let json_res = response.into_json::<FactoryInfo<RoboShopItemsInfo>>();
  104. if let Ok(json) = json_res {
  105. return Ok(json);
  106. }
  107. return Err(Error::Status(500, Response::new(500, "Malformed JSON", "").unwrap())); // server returned malformed data
  108. }
  109. Err(result.err().unwrap())
  110. }
  111. }