use serde::de::DeserializeOwned;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Default, Serialize)]
pub struct Value {
#[serde(skip_serializing_if = "Option::is_none")]
pub headers: Option<HashMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<serde_json::Value>,
}
impl Value {
pub fn data_as_ref(&self) -> &serde_json::Value {
static NULL: serde_json::Value = serde_json::Value::Null;
self.data.as_ref().unwrap_or(&NULL)
}
pub fn data_or_null(&self) -> serde_json::Value {
self.data.clone().unwrap_or(serde_json::Value::Null)
}
pub fn into_data_or_null(self) -> serde_json::Value {
self.data.unwrap_or(serde_json::Value::Null)
}
pub fn headers_or_empty(&self) -> HashMap<String, String> {
self.headers.clone().unwrap_or_default()
}
pub fn from_serializable<T: Serialize>(val: T) -> crate::error::Result<Self> {
Ok(Self {
headers: None,
data: Some(serde_json::to_value(val)?),
})
}
pub fn decode<T: DeserializeOwned>(&self) -> crate::error::Result<T> {
T::deserialize(self.data_as_ref()).map_err(Into::into)
}
pub fn into_decoded<T: DeserializeOwned>(self) -> crate::error::Result<T> {
serde_json::from_value(self.into_data_or_null()).map_err(Into::into)
}
}
impl<'de> Deserialize<'de> for Value {
fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let v = serde_json::Value::deserialize(deserializer)?;
match v {
serde_json::Value::Null => Ok(Value::default()),
serde_json::Value::Object(map) => {
let headers: Option<HashMap<String, String>> = map
.get("headers")
.and_then(|h| serde_json::from_value(h.clone()).ok());
let data = map.get("data").cloned();
Ok(Value { headers, data })
}
other => Ok(Value {
headers: None,
data: Some(other),
}),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum PromiseState {
#[serde(rename = "pending")]
Pending,
#[serde(rename = "resolved")]
Resolved,
#[serde(rename = "rejected")]
Rejected,
#[serde(rename = "rejected_canceled")]
RejectedCanceled,
#[serde(rename = "rejected_timedout")]
RejectedTimedout,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PromiseRecord {
pub id: String,
pub state: PromiseState,
#[serde(default)]
pub param: Value,
#[serde(default)]
pub value: Value,
#[serde(default)]
pub tags: HashMap<String, String>,
pub timeout_at: i64,
#[serde(default)]
pub created_at: i64,
#[serde(default)]
pub settled_at: Option<i64>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum TaskState {
#[serde(rename = "pending")]
Pending,
#[serde(rename = "acquired")]
Acquired,
#[serde(rename = "suspended")]
Suspended,
#[serde(rename = "halted")]
Halted,
#[serde(rename = "fulfilled")]
Fulfilled,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TaskRecord {
pub id: String,
pub state: TaskState,
pub version: i64,
#[serde(default)]
pub resumes: serde_json::Value,
#[serde(default)]
pub ttl: Option<i64>,
#[serde(default)]
pub pid: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ScheduleRecord {
pub id: String,
pub cron: String,
pub promise_id: String,
pub promise_timeout: i64,
#[serde(default)]
pub promise_param: Value,
#[serde(default)]
pub promise_tags: HashMap<String, String>,
#[serde(default)]
pub created_at: i64,
#[serde(default)]
pub next_run_at: i64,
#[serde(default)]
pub last_run_at: Option<i64>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum SettleState {
#[serde(rename = "resolved")]
Resolved,
#[serde(rename = "rejected")]
Rejected,
#[serde(rename = "rejected_canceled")]
RejectedCanceled,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PromiseCreateReq {
pub id: String,
pub timeout_at: i64,
pub param: Value,
pub tags: HashMap<String, String>,
}
impl PromiseCreateReq {
pub(crate) fn default_with_id(id: &str) -> Self {
Self {
id: id.to_string(),
timeout_at: 0,
param: Value {
headers: None,
data: None,
},
tags: HashMap::new(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PromiseSettleReq {
pub id: String,
pub state: SettleState,
pub value: Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PromiseRegisterCallbackData {
pub awaited: String,
pub awaiter: String,
}
#[derive(Debug)]
pub enum Outcome<T> {
Done(crate::error::Result<T>),
Suspended { remote_todos: Vec<String> },
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DurableKind {
Function,
Workflow,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TaskData {
pub func: String,
#[serde(default)]
pub args: serde_json::Value,
}
impl TaskData {
pub fn into_value<A: Serialize>(func: &str, args: A) -> crate::error::Result<Value> {
Value::from_serializable(serde_json::json!({
"func": func,
"args": serde_json::to_value(args)?,
}))
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Status {
Done,
Suspended,
}