flawless_utils/
workflow.rs

1use flawless::message::Message;
2use reqwest::Client;
3use serde::{Deserialize, Serialize};
4
5use crate::Server;
6
7#[derive(Debug, Deserialize)]
8pub struct WorkflowRef {
9    pub(crate) server: Option<Server>,
10    id: String,
11    response: Option<String>,
12}
13
14impl WorkflowRef {
15    pub fn id(&self) -> &str {
16        &self.id
17    }
18
19    pub fn response(&self) -> &Option<String> {
20        &self.response
21    }
22
23    /// Send message to workflow.
24    pub async fn send_msg<M: Message>(&self, msg: M) -> Result<(), String> {
25        let type_ = M::TYPE.to_string();
26        let data = serde_json::to_string(&msg).map_err(|_err| "Serialization failed".to_string())?;
27        let msg = Msg { type_, data };
28
29        let send_msg_url = format!("{}/api/workflow/send-msg/{}", self.server.as_ref().unwrap().url, self.id);
30        let client = Client::new();
31        let mut request = client.post(send_msg_url).json(&msg);
32
33        if let Some(auth_token) = &self.server.as_ref().unwrap().auth_token {
34            request = request.header("Authorization", &format!("Bearer {}", auth_token));
35        }
36
37        match request.send().await {
38            Ok(response) => {
39                let response = response.text().await.map_err(|_err| "Unable to read response".to_string())?;
40                let response: SendMsgResponse = serde_json::from_str(&response)
41                    .map_err(|err| format!("Failed to parse flawless response as json. {err}"))?;
42                match response {
43                    SendMsgResponse::Ok => Ok(()),
44                    SendMsgResponse::Error(err) => Err(err),
45                }
46            }
47            Err(err) => {
48                Err(format!("Failed to send request to `{}`. {err}", self.server.as_ref().unwrap().url))
49            }
50        }
51    }
52}
53
54#[derive(Debug, Serialize, Deserialize)]
55pub struct Msg {
56    #[serde(rename = "type")]
57    pub type_: String,
58    pub data: String,
59}
60
61#[derive(Debug, Deserialize)]
62enum SendMsgResponse {
63    #[serde(rename = "ok")]
64    Ok,
65    #[serde(rename = "error")]
66    Error(String),
67}