use crate::id::NodeId;
use vize_l0::String;
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum WitnessKey {
Artifact,
Node(NodeId),
Index(u32),
Name(String),
}
pub trait WitnessKeyed: Sized {
fn to_witness_key(&self) -> WitnessKey;
fn from_witness_key(key: &WitnessKey) -> Option<Self>;
}
impl WitnessKeyed for () {
fn to_witness_key(&self) -> WitnessKey {
WitnessKey::Artifact
}
fn from_witness_key(key: &WitnessKey) -> Option<Self> {
matches!(key, WitnessKey::Artifact).then_some(())
}
}
impl WitnessKeyed for NodeId {
fn to_witness_key(&self) -> WitnessKey {
WitnessKey::Node(*self)
}
fn from_witness_key(key: &WitnessKey) -> Option<Self> {
match key {
WitnessKey::Node(node) => Some(*node),
WitnessKey::Artifact | WitnessKey::Index(_) | WitnessKey::Name(_) => None,
}
}
}
impl WitnessKeyed for u32 {
fn to_witness_key(&self) -> WitnessKey {
WitnessKey::Index(*self)
}
fn from_witness_key(key: &WitnessKey) -> Option<Self> {
match key {
WitnessKey::Index(index) => Some(*index),
WitnessKey::Artifact | WitnessKey::Node(_) | WitnessKey::Name(_) => None,
}
}
}
impl WitnessKeyed for String {
fn to_witness_key(&self) -> WitnessKey {
WitnessKey::Name(self.clone())
}
fn from_witness_key(key: &WitnessKey) -> Option<Self> {
match key {
WitnessKey::Name(name) => Some(name.clone()),
WitnessKey::Artifact | WitnessKey::Node(_) | WitnessKey::Index(_) => None,
}
}
}