apalis_file_storage/
meta.rs1use apalis_core::task::metadata::MetadataExt;
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
6pub struct JsonMapMetadata(serde_json::Map<String, serde_json::Value>);
7
8impl<T: Serialize + for<'de> Deserialize<'de>> MetadataExt<T> for JsonMapMetadata {
9 type Error = serde_json::Error;
10 fn extract(&self) -> Result<T, serde_json::Error> {
11 use serde::de::Error as _;
12 let key = std::any::type_name::<T>();
13 match self.0.get(key) {
14 Some(value) => T::deserialize(value),
15 None => Err(serde_json::Error::custom(format!(
16 "No entry for type `{key}` in metadata"
17 ))),
18 }
19 }
20
21 fn inject(&mut self, value: T) -> Result<(), serde_json::Error> {
22 let key = std::any::type_name::<T>();
23 let json_value = serde_json::to_value(value)?;
24 self.0.insert(key.to_owned(), json_value);
25 Ok(())
26 }
27}