1pub mod error;
2pub mod filter;
3pub mod run;
4pub mod settings;
5
6pub mod tag;
7pub mod variable;
8pub mod variable_set;
9pub mod workspace;
10
11use crate::settings::Core;
12use log::error;
13use serde::{Deserialize, Serialize};
14use serde_json::Value;
15use surf::{http::Method, Request, RequestBuilder};
16use url::Url;
17
18pub const BASE_URL: &str = "https://app.terraform.io/api/v2";
19
20#[derive(Clone, Debug, Deserialize, Serialize)]
21pub struct Pagination {
22 #[serde(rename = "current-page")]
23 pub current_page: u32,
24 #[serde(rename = "page-size")]
25 pub page_size: u32,
26 #[serde(rename = "prev-page")]
27 pub prev_page: Option<u32>,
28 #[serde(rename = "next-page")]
29 pub next_page: Option<u32>,
30 #[serde(rename = "total-pages")]
31 pub total_pages: u32,
32 #[serde(rename = "total-count")]
33 pub total_count: u32,
34}
35
36#[derive(Clone, Debug, Deserialize, Serialize)]
37pub struct Meta {
38 pub pagination: Pagination,
39}
40
41pub(crate) fn set_page_number(page_number: u32, u: Url) -> Option<Url> {
42 let u = match Url::parse_with_params(
43 u.clone().as_str(),
44 &[("page[number]", &page_number.to_string())],
45 ) {
46 Ok(u) => u,
47 Err(e) => {
48 error!("{:#?}", e);
49 return None;
50 }
51 };
52 Some(u)
53}
54
55pub(crate) fn build_request(
56 method: Method,
57 url: Url,
58 config: &Core,
59 body: Option<Value>,
60) -> Request {
61 let mut req = RequestBuilder::new(method, url.clone())
62 .header("Authorization", format!("Bearer {}", config.token))
63 .header("Content-Type", "application/vnd.api+json")
64 .build();
65 if let Some(body) = body {
66 req.set_body(body);
67 }
68 req
69}