use crate::rpc::{typed_data::Data, TypedData};
use serde::Deserialize;
use serde_json::{from_str, Number, Value};
use std::collections::HashMap;
const INSTANCE_ID_KEY: &str = "instanceId";
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DurableActivityContext {
pub input: Value,
pub instance_id: String,
}
impl DurableActivityContext {
#[doc(hidden)]
pub fn new(data: TypedData, mut metadata: HashMap<String, TypedData>) -> Self {
DurableActivityContext {
input: match data.data {
Some(Data::String(s)) => Value::String(s),
Some(Data::Json(s)) => from_str(&s).unwrap_or_default(),
Some(Data::Int(i)) => Value::Number(i.into()),
Some(Data::Double(d)) => Value::Number(Number::from_f64(d).unwrap()),
_ => Value::Null,
},
instance_id: metadata
.remove(INSTANCE_ID_KEY)
.map(|data| match data.data {
Some(Data::String(s)) => s,
_ => panic!("expected a string for instance id"),
})
.expect("expected an instance id"),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::rpc::typed_data::Data;
#[test]
fn it_constructs() {
let data = TypedData {
data: Some(Data::String("bar".to_string())),
};
let mut metadata = HashMap::new();
metadata.insert(
INSTANCE_ID_KEY.to_string(),
TypedData {
data: Some(Data::String("foo".to_string())),
},
);
let context = DurableActivityContext::new(data, metadata);
assert_eq!(context.instance_id, "foo");
assert_eq!(context.input, Value::String("bar".to_string()));
}
}