tfc_toolset/
lib.rs

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}