flawless_utils/
workflow.rs1use 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 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}