use std::sync::Arc;
use serde::{Deserialize, Serialize};
use ts_rs::TS;
use crate::core::item::AnyItem;
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::SerializeStruct;
let mut s = serializer.serialize_struct("WrappedItem", 2)?;
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>,
}