use reqwest::Method;
use reqwest_eventsource::EventSource;
use serde::Deserialize;
use crate::client::Client;
use crate::error::VynFiError;
use crate::types::*;
#[derive(Debug, Default)]
pub struct ListJobsParams {
pub limit: Option<u32>,
pub status: Option<String>,
pub after: Option<String>,
pub before: Option<String>,
}
#[derive(Debug, Clone)]
pub struct SseEvent {
pub event: String,
pub data: serde_json::Value,
}
#[derive(Deserialize)]
struct JobListResponse {
#[serde(alias = "data")]
jobs: Vec<Job>,
#[serde(default)]
has_more: bool,
next_cursor: Option<String>,
}
pub struct Jobs<'a> {
client: &'a Client,
}
impl<'a> Jobs<'a> {
pub(crate) fn new(client: &'a Client) -> Self {
Self { client }
}
pub async fn generate(&self, req: &GenerateRequest) -> Result<SubmitJobResponse, VynFiError> {
self.client
.request_with_body(Method::POST, "/v1/generate", Some(req))
.await
}
pub async fn generate_quick(&self, req: &GenerateRequest) -> Result<Job, VynFiError> {
self.client
.request_with_body(Method::POST, "/v1/generate/quick", Some(req))
.await
}
pub async fn list(&self, params: &ListJobsParams) -> Result<JobList, VynFiError> {
let mut query: Vec<(&str, String)> = Vec::new();
if let Some(limit) = params.limit {
query.push(("limit", limit.to_string()));
}
if let Some(ref status) = params.status {
query.push(("status", status.clone()));
}
if let Some(ref after) = params.after {
query.push(("after", after.clone()));
}
if let Some(ref before) = params.before {
query.push(("before", before.clone()));
}
let resp: JobListResponse = self
.client
.request_with_params(Method::GET, "/v1/jobs", &query)
.await?;
Ok(JobList {
jobs: resp.jobs,
has_more: resp.has_more,
next_cursor: resp.next_cursor,
})
}
pub async fn get(&self, job_id: &str) -> Result<Job, VynFiError> {
self.client
.request(Method::GET, &format!("/v1/jobs/{}", job_id))
.await
}
pub async fn cancel(&self, job_id: &str) -> Result<Job, VynFiError> {
self.client
.request(Method::DELETE, &format!("/v1/jobs/{}", job_id))
.await
}
pub fn stream(&self, job_id: &str) -> EventSource {
let url = self.client.url(&format!("/v1/jobs/{}/stream", job_id));
let builder = self.client.http().get(&url);
EventSource::new(builder).expect("valid request builder")
}
pub async fn download(&self, job_id: &str) -> Result<bytes::Bytes, VynFiError> {
let resp = self
.client
.request_raw(Method::GET, &format!("/v1/jobs/{}/download", job_id))
.await?;
Ok(resp.bytes().await?)
}
}