apalis_file_storage/
meta.rs

1use apalis_core::task::metadata::MetadataExt;
2use serde::{Deserialize, Serialize};
3
4/// A simple wrapper around a JSON map to represent task metadata
5#[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}