pub use progenitor_client::{ByteStream, Error, ResponseValue}; pub mod types { use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Debug, Clone)] pub struct EnrolBody { pub host: String, pub key: String, } #[derive(Serialize, Deserialize, Debug, Clone)] pub struct GlobalJobsResult { pub summary: Vec, } #[derive(Serialize, Deserialize, Debug, Clone)] pub struct OutputRecord { pub msg: String, pub stream: String, pub time: chrono::DateTime, } #[derive(Serialize, Deserialize, Debug, Clone)] pub struct PingResult { pub host: String, pub ok: bool, } #[derive(Serialize, Deserialize, Debug, Clone)] pub struct ReportFinishBody { pub duration_millis: i32, pub end_time: chrono::DateTime, pub exit_status: i32, pub id: ReportId, } #[derive(Serialize, Deserialize, Debug, Clone)] pub struct ReportId { pub host: String, pub job: String, pub pid: u64, pub time: chrono::DateTime, pub uuid: String, } #[derive(Serialize, Deserialize, Debug, Clone)] pub struct ReportOutputBody { pub id: ReportId, pub record: OutputRecord, } #[derive(Serialize, Deserialize, Debug, Clone)] pub struct ReportResult { pub existed_already: bool, } #[derive(Serialize, Deserialize, Debug, Clone)] pub struct ReportStartBody { pub id: ReportId, pub script: String, pub start_time: chrono::DateTime, } #[derive(Serialize, Deserialize, Debug, Clone)] pub struct ReportSummary { pub age_seconds: i32, pub duration_seconds: i32, pub host: String, pub job: String, pub status: i32, pub when: chrono::DateTime, } } #[derive(Clone)] pub struct Client { baseurl: String, client: reqwest::Client, } impl Client { pub fn new(baseurl: &str) -> Self { let dur = std::time::Duration::from_secs(15); let client = reqwest::ClientBuilder::new() .connect_timeout(dur) .timeout(dur) .build() .unwrap(); Self::new_with_client(baseurl, client) } pub fn new_with_client(baseurl: &str, client: reqwest::Client) -> Self { Self { baseurl: baseurl.to_string(), client, } } pub fn baseurl(&self) -> &String { &self.baseurl } pub fn client(&self) -> &reqwest::Client { &self.client } #[doc = "Sends a `POST` request to `/enrol`"] pub async fn enrol<'a>( &'a self, body: &'a types::EnrolBody, ) -> Result, Error<()>> { let url = format!("{}/enrol", self.baseurl,); let request = self.client.post(url).json(body).build()?; let result = self.client.execute(request).await; let response = result?; match response.status().as_u16() { 201u16 => Ok(ResponseValue::empty(response)), _ => Err(Error::UnexpectedResponse(response)), } } #[doc = "Sends a `GET` request to `/global/jobs`"] pub async fn global_jobs<'a>( &'a self, ) -> Result, Error<()>> { let url = format!("{}/global/jobs", self.baseurl,); let request = self.client.get(url).build()?; let result = self.client.execute(request).await; let response = result?; match response.status().as_u16() { 201u16 => ResponseValue::from_response(response).await, _ => Err(Error::UnexpectedResponse(response)), } } #[doc = "Sends a `GET` request to `/ping`"] pub async fn ping<'a>(&'a self) -> Result, Error<()>> { let url = format!("{}/ping", self.baseurl,); let request = self.client.get(url).build()?; let result = self.client.execute(request).await; let response = result?; match response.status().as_u16() { 201u16 => ResponseValue::from_response(response).await, _ => Err(Error::UnexpectedResponse(response)), } } #[doc = "Sends a `POST` request to `/report/finish`"] pub async fn report_finish<'a>( &'a self, body: &'a types::ReportFinishBody, ) -> Result, Error<()>> { let url = format!("{}/report/finish", self.baseurl,); let request = self.client.post(url).json(body).build()?; let result = self.client.execute(request).await; let response = result?; match response.status().as_u16() { 201u16 => ResponseValue::from_response(response).await, _ => Err(Error::UnexpectedResponse(response)), } } #[doc = "Sends a `POST` request to `/report/output`"] pub async fn report_output<'a>( &'a self, body: &'a types::ReportOutputBody, ) -> Result, Error<()>> { let url = format!("{}/report/output", self.baseurl,); let request = self.client.post(url).json(body).build()?; let result = self.client.execute(request).await; let response = result?; match response.status().as_u16() { 201u16 => ResponseValue::from_response(response).await, _ => Err(Error::UnexpectedResponse(response)), } } #[doc = "Sends a `POST` request to `/report/start`"] pub async fn report_start<'a>( &'a self, body: &'a types::ReportStartBody, ) -> Result, Error<()>> { let url = format!("{}/report/start", self.baseurl,); let request = self.client.post(url).json(body).build()?; let result = self.client.execute(request).await; let response = result?; match response.status().as_u16() { 201u16 => ResponseValue::from_response(response).await, _ => Err(Error::UnexpectedResponse(response)), } } }