modelrelay/
workflows.rs

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        // Request body is the workflow spec itself.
37        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}