use super::models::*;
use crate::error::Result;
use crate::transport::Transport;
const ROUTE: &str = "/api/v1/jobs";
#[derive(Debug, Clone, Default)]
pub struct GetJobsParams {
pub page: Option<i32>,
pub page_size: Option<i32>,
pub subscription_id: Option<i32>,
pub start: Option<String>,
pub end: Option<String>,
}
#[derive(Clone)]
pub struct JobsClient {
transport: Transport,
}
impl JobsClient {
pub(crate) fn new(transport: Transport) -> Self {
Self { transport }
}
pub async fn get_jobs(&self, params: &GetJobsParams) -> Result<PagedResultOfJobDto> {
let mut query: Vec<String> = Vec::new();
if let Some(page) = params.page {
query.push(format!("page={page}"));
}
if let Some(page_size) = params.page_size {
query.push(format!("pageSize={page_size}"));
}
if let Some(subscription_id) = params.subscription_id {
query.push(format!("subscriptionId={subscription_id}"));
}
if let Some(start) = ¶ms.start {
query.push(format!("start={}", urlencode(start)));
}
if let Some(end) = ¶ms.end {
query.push(format!("end={}", urlencode(end)));
}
let path = if query.is_empty() {
ROUTE.to_string()
} else {
format!("{ROUTE}?{}", query.join("&"))
};
self.transport.get_json(&path).await
}
pub async fn create_job(&self, request: &CreateJobRequest) -> Result<JobDto> {
self.transport.post_json(ROUTE, request).await
}
pub async fn get_job(&self, job_id: &str) -> Result<JobDto> {
self.transport.get_json(&format!("{ROUTE}/{job_id}")).await
}
}
fn urlencode(value: &str) -> String {
let mut encoded = String::with_capacity(value.len());
for byte in value.bytes() {
match byte {
b'A'..=b'Z' | b'a'..=b'z' | b'0'..=b'9' | b'-' | b'_' | b'.' | b'~' => {
encoded.push(byte as char);
}
_ => encoded.push_str(&format!("%{byte:02X}")),
}
}
encoded
}