use std::borrow::Cow;
use std::collections::{HashMap, HashSet};
use facet_core::Shape;
use facet_reflect::Peek;
use crate::core_sequences::Updates;
pub enum Diff<'mem, 'facet> {
Equal {
value: Option<Peek<'mem, 'facet>>,
},
Replace {
from: Peek<'mem, 'facet>,
to: Peek<'mem, 'facet>,
},
User {
from: &'static Shape,
to: &'static Shape,
variant: Option<&'static str>,
value: Value<'mem, 'facet>,
},
Sequence {
from: &'static Shape,
to: &'static Shape,
updates: Updates<'mem, 'facet>,
},
}
impl<'mem, 'facet> Diff<'mem, 'facet> {
pub const fn is_equal(&self) -> bool {
matches!(self, Self::Equal { .. })
}
}
pub enum Value<'mem, 'facet> {
Tuple {
updates: Updates<'mem, 'facet>,
},
Struct {
updates: HashMap<Cow<'static, str>, Diff<'mem, 'facet>>,
deletions: HashMap<Cow<'static, str>, Peek<'mem, 'facet>>,
insertions: HashMap<Cow<'static, str>, Peek<'mem, 'facet>>,
unchanged: HashSet<Cow<'static, str>>,
},
}
impl<'mem, 'facet> Value<'mem, 'facet> {
pub fn closeness(&self) -> usize {
match self {
Self::Tuple { updates } => updates.closeness(),
Self::Struct { unchanged, .. } => unchanged.len(),
}
}
}