use core::range::Range;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct TokenProvenance {
pub parts: Vec<ProvenancePart>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ProvenancePart {
Source(#[cfg_attr(feature = "serde", serde(with = "crate::serde_range"))] Range<usize>),
Synthesized(String),
OpaqueTag(String),
}
impl TokenProvenance {
pub fn from_source(range: Range<usize>) -> Self {
Self { parts: vec![ProvenancePart::Source(range)] }
}
pub fn from_synthesized(s: impl Into<String>) -> Self {
Self { parts: vec![ProvenancePart::Synthesized(s.into())] }
}
}