use std::sync::Arc;
use serde::{Deserialize, Serialize};
use crate::{
TS,
core::item::{AnyItem, lookup_item_registration},
};
pub struct SerializableItem<'a>(pub &'a dyn AnyItem);
impl Serialize for SerializableItem<'_> {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
erased_serde::serialize(self.0, serializer)
}
}
#[derive(Clone)]
pub struct ErasedWrappedItem {
pub item: Arc<dyn AnyItem>,
pub item_type: Arc<str>,
}
impl std::fmt::Debug for ErasedWrappedItem {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("ErasedWrappedItem")
.field("item_type", &self.item_type)
.field("id", &self.item.id())
.finish()
}
}
impl Serialize for ErasedWrappedItem {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
use serde::ser::{Error as _, SerializeStruct};
let json_raw = if serializer.is_human_readable() {
lookup_item_registration(self.item_type.as_ref())
.map(|reg| (reg.serialize_json)(&*self.item).map_err(S::Error::custom))
.transpose()?
} else {
None
};
let mut s = serializer.serialize_struct("WrappedItem", 2)?;
match json_raw {
Some(raw) => s.serialize_field("item", &raw)?,
None => s.serialize_field("item", &*self.item as &dyn erased_serde::Serialize)?,
}
s.serialize_field("itemType", &self.item_type)?;
s.end()
}
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
#[serde(rename_all = "camelCase")]
pub struct WrappedItem {
pub item: serde_json::Value,
pub item_type: Arc<str>,
}