use crate::config::get_configuration;
use crate::markup;
use crate::postman::{ApiResponse, Collection, Environment, Environments, Item, SingleEnvironment};
use std::fs;
pub struct Parser {
page: String,
links: String,
requests: String,
loop_iter: u16,
request_iter: u16,
current_folder: String,
environments: String,
}
impl Parser {
pub fn new() -> Parser {
Parser {
page: String::new(),
links: String::new(),
requests: String::new(),
loop_iter: 1,
request_iter: 0,
current_folder: String::new(),
environments: String::new(),
}
}
pub fn env_to_ts(&mut self, envs: Vec<Environment>) {
self.environments.push_str(
r#"import { writable } from 'svelte/store';
export const envs = writable({ "#,
);
for env in envs {
let name = env.name;
self.environments.push_str(&format!("\"{name}\": {{"));
if let Some(vals) = env.values {
for val in vals {
let key = val.key;
let value = val.value;
let env_string = format!("\n\"{key}\": \"{value}\",");
self.environments.push_str(&env_string);
}
}
self.environments.push_str(&format!("\n}},"));
}
self.environments.push_str("\n});")
}
pub fn loop_items(&mut self, items: &Vec<Item>) {
for item in items {
if let Some(request) = &item.request {
let path_markup = markup::request(&item, &request, self.request_iter);
self.page.push_str(&path_markup.0);
self.requests.push_str(&path_markup.1);
self.request_iter += 1;
} else if let Some(responses) = &item.responses {
let response_markup = markup::response(responses);
self.page.push_str(&response_markup);
} else {
self.current_folder = item.name.clone();
let (folder, link) = markup::folder(&item, self.loop_iter);
self.page.push_str(&folder);
self.links.push_str(&link);
if let Some(item) = &item.item {
self.loop_iter += 1;
self.loop_items(&item);
}
}
}
self.loop_iter -= 1;
}
pub fn write_to_disk(&self) {
let page = format!(
"<script>\nimport Request from '../components/Request.svelte';\n\n</script>{}",
&self.page
);
let requests = markup::requests(&self.requests);
fs::write("./site/src/requests.ts", &requests).expect("Unable to write file");
fs::write("./site/src/pages/ultdocs.svelte", page).expect("Unable to write file");
fs::write("./site/src/components/links.svelte", &self.links).expect("Unable to write file");
fs::write("./site/src/envs.ts", &self.environments).expect("Unable to write file");
}
pub fn backup_collection(&self, collection: &Collection, backup_path: String) {
fs::write(
backup_path,
serde_json::to_string_pretty(collection).expect("Unable to parse JSON to string"),
)
.expect("Unable to write file");
}
pub fn get_environment(&mut self) -> Vec<Environment> {
let config = &get_configuration();
println!("Reading environment from Postman remotely");
let client = reqwest::blocking::Client::new();
let collection_route = "https://api.getpostman.com/environments".to_string();
let data = client
.get(collection_route)
.header("X-API-Key", &config.postman_api_key.clone())
.send()
.expect("Unable to retrieve Response from the Postman API")
.text()
.expect("Unable to parse text from Response body");
let mut environments: Environments =
serde_json::from_str(&data).expect("JSON was not well-formatted");
let mut envs = Vec::new();
for env in &mut environments.environments {
let env_route = "https://api.getpostman.com/environments/".to_string() + &env.id;
let env_data = client
.get(env_route)
.header("X-API-Key", &config.postman_api_key)
.send()
.expect("Unable to retrieve Response from the Postman API")
.text()
.expect("Unable to parse text from Response body");
let env_single: SingleEnvironment =
serde_json::from_str(&env_data).expect("JSON was not well-formatted");
envs.push(env_single.environment);
}
envs
}
}
pub fn get_collection() -> Collection {
let config = &get_configuration();
let data: String;
let collection: Collection;
if config.collection_from_api {
println!("Reading collection from Postman remotely");
let client = reqwest::blocking::Client::new();
let mut collection_route = "https://api.getpostman.com/collections/".to_string();
collection_route.push_str(&config.collection_id);
data = client
.get(collection_route)
.header("X-API-Key", &config.postman_api_key)
.send()
.expect("Unable to retrieve Response from the Postman API")
.text()
.expect("Unable to parse text from Response body");
let api_response: ApiResponse =
serde_json::from_str(&data).expect("JSON was not well-formatted");
collection = api_response.collection;
return collection;
} else {
data = fs::read_to_string(&config.collection_path).expect("Failed to read file");
collection = serde_json::from_str(&data).expect("JSON was not well-formatted");
return collection;
}
}