apalis_core/backend/impls/json/
meta.rs

1use serde::{Serialize, de::DeserializeOwned};
2
3pub(super) type JsonMapMetadata = serde_json::Map<String, serde_json::Value>;
4
5impl<T> crate::task::metadata::MetadataExt<T> for JsonMapMetadata
6where
7    T: Serialize + DeserializeOwned,
8{
9    type Error = serde_json::Error;
10
11    fn extract(&self) -> Result<T, serde_json::Error> {
12        use serde::de::Error as _;
13        let key = std::any::type_name::<T>();
14        match self.get(key) {
15            Some(value) => T::deserialize(value),
16            None => Err(serde_json::Error::custom(format!(
17                "No entry for type `{key}` in metadata"
18            ))),
19        }
20    }
21
22    fn inject(&mut self, value: T) -> Result<(), serde_json::Error> {
23        let key = std::any::type_name::<T>();
24        let json_value = serde_json::to_value(value)?;
25        self.insert(key.to_owned(), json_value);
26        Ok(())
27    }
28}