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.

145 lines
4.7KB

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