use crate::interning::Internable;
use hax_frontend_exporter::{DefKind, DefPathItem, DisambiguatedDefPathItem};
use super::{DefIdInner, ExplicitDefId};
type Repr = (String, Vec<(DefPathItem, u32)>, DefKind, bool);
type BorrowedRepr<'a> = (
&'a String,
Vec<(&'a DefPathItem, &'a u32)>,
&'a DefKind,
bool,
);
pub fn serialize(edid: &ExplicitDefId) -> String {
let did = &edid.def_id;
let path = did
.path
.iter()
.map(
|DisambiguatedDefPathItem {
data,
disambiguator,
}| (data, disambiguator),
)
.collect::<Vec<_>>();
let data: BorrowedRepr<'_> = (&did.krate, path, &did.kind, edid.is_constructor);
serde_json::to_string(&data).unwrap()
}
pub fn deserialize(s: &str, parent: Option<ExplicitDefId>) -> ExplicitDefId {
let (krate, path, kind, is_constructor): Repr = serde_json::from_str(s).unwrap();
ExplicitDefId {
def_id: DefIdInner {
parent: parent.map(|parent| parent.def_id),
krate,
path: path
.into_iter()
.map(|(data, disambiguator)| DisambiguatedDefPathItem {
data,
disambiguator,
})
.collect(),
kind,
}
.intern(),
is_constructor,
}
}