1use reqwest::{header::ACCEPT, Method};
2use serde::Deserialize;
3use serde_json::Value;
4
5use crate::{
6 client::ClientInner,
7 errors::{APIError, Error, Result, WorkflowValidationError},
8 http::HeaderList,
9 workflow::{PlanHash, WorkflowSpecV0},
10};
11
12#[derive(Clone)]
13pub struct WorkflowsClient {
14 pub(crate) inner: std::sync::Arc<ClientInner>,
15}
16
17#[derive(Debug, Clone, Deserialize)]
18pub struct WorkflowsCompileResponseV0 {
19 pub plan_json: Value,
20 pub plan_hash: PlanHash,
21}
22
23#[derive(Debug, Clone)]
24pub enum WorkflowsCompileResultV0 {
25 Ok(WorkflowsCompileResponseV0),
26 ValidationError(WorkflowValidationError),
27 InternalError(APIError),
28}
29
30impl WorkflowsClient {
31 pub async fn compile_v0(&self, spec: WorkflowSpecV0) -> Result<WorkflowsCompileResultV0> {
32 self.inner.ensure_auth()?;
33
34 let path = "/workflows/compile";
35 let mut builder = self.inner.request(Method::POST, path)?;
36 builder = builder.json(&spec);
38 builder = self.inner.with_headers(
39 builder,
40 None,
41 &HeaderList::default(),
42 Some("application/json"),
43 )?;
44 builder = builder.header(ACCEPT, "application/json");
45 builder = self.inner.with_timeout(builder, None, true);
46 let ctx = self.inner.make_context(&Method::POST, path, None, None);
47
48 match self
49 .inner
50 .execute_json::<WorkflowsCompileResponseV0>(builder, Method::POST, None, ctx)
51 .await
52 {
53 Ok(out) => Ok(WorkflowsCompileResultV0::Ok(out)),
54 Err(Error::WorkflowValidation(verr)) => {
55 Ok(WorkflowsCompileResultV0::ValidationError(verr))
56 }
57 Err(Error::Api(api_err)) => Ok(WorkflowsCompileResultV0::InternalError(api_err)),
58 Err(other) => Err(other),
59 }
60 }
61}