use serde::{de::DeserializeOwned, Serialize};
pub type StepError = Box<dyn std::error::Error + Send + Sync>;
pub type StepFuture<T> =
std::pin::Pin<Box<dyn std::future::Future<Output = Result<T, StepError>> + Send>>;
pub trait DurableValue: Serialize + DeserializeOwned + Send {}
impl<T> DurableValue for T where T: Serialize + DeserializeOwned + Send {}
#[cfg(test)]
mod tests {
use super::*;
use serde::{Deserialize, Serialize};
#[test]
fn test_durable_value_primitives() {
fn assert_durable_value<T: DurableValue>() {}
assert_durable_value::<i32>();
assert_durable_value::<i64>();
assert_durable_value::<u32>();
assert_durable_value::<u64>();
assert_durable_value::<f32>();
assert_durable_value::<f64>();
assert_durable_value::<bool>();
assert_durable_value::<String>();
assert_durable_value::<()>();
}
#[test]
fn test_durable_value_collections() {
fn assert_durable_value<T: DurableValue>() {}
assert_durable_value::<Vec<i32>>();
assert_durable_value::<Vec<String>>();
assert_durable_value::<std::collections::HashMap<String, i32>>();
assert_durable_value::<Option<String>>();
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
struct TestStruct {
id: String,
value: i32,
}
#[test]
fn test_durable_value_custom_struct() {
fn assert_durable_value<T: DurableValue>() {}
assert_durable_value::<TestStruct>();
}
#[test]
fn test_durable_value_serialization() {
fn serialize_value<T: DurableValue>(value: &T) -> String {
serde_json::to_string(value).unwrap()
}
fn deserialize_value<T: DurableValue>(json: &str) -> T {
serde_json::from_str(json).unwrap()
}
let original = TestStruct {
id: "test-123".to_string(),
value: 42,
};
let json = serialize_value(&original);
let restored: TestStruct = deserialize_value(&json);
assert_eq!(original, restored);
}
}