apalis_core/backend/impls/json/
meta.rs1use 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}