use reqwest::{Client, Response};
use async_trait::async_trait;
use serde::Serialize;
use std::collections::HashMap;
use std::env;
use crate::api::traits::Fetch;
use crate::api::vercel::VERCEL_ACCESS_TOKEN;
use crate::error::FluxError;
#[derive(Serialize)]
pub struct VercelEnvironmentSelect {
pub id_or_name: String,
pub token: Option<String>,
pub decrypt: Option<bool>,
pub git_branch: Option<String>,
pub slug: Option<String>,
pub team_id: Option<String>,
pub source: Option<String>,
}
#[async_trait]
impl Fetch for VercelEnvironmentSelect {
async fn fetch(&self, client: &Client) -> Result<Response, FluxError> {
let mut query_params = HashMap::new();
if let Some(decrypt) = self.decrypt {
query_params.insert("decrypt", decrypt.to_string());
}
if let Some(git_branch) = &self.git_branch {
query_params.insert("gitBranch", git_branch.clone());
}
if let Some(slug) = &self.slug {
query_params.insert("slug", slug.clone());
}
if let Some(team_id) = &self.team_id {
query_params.insert("teamId", team_id.clone());
}
if let Some(source) = &self.source {
query_params.insert("source", source.clone());
}
client.get(&format!("https://api.vercel.com/v9/projects/{}/env", self.id_or_name))
.bearer_auth(env::var(VERCEL_ACCESS_TOKEN).unwrap_or_else(|_| self.token.clone().unwrap_or_default()))
.query(&query_params)
.send()
.await
.map_err(FluxError::from_reqwest_error)
}
}