use std::fmt;
use crate::projection::podbuf::Source;
use crate::v2;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub(crate) enum Root {
Declaration(String),
Foreign { package: String, name: String },
Tuple(u32),
}
impl Root {
pub fn of(decl: &v2::Decl, declaring: &v2::Package, package: &v2::Package) -> Self {
if declaring.name == package.name {
Self::Declaration(decl.name.clone())
} else {
Self::Foreign {
package: declaring.name.clone(),
name: decl.name.clone(),
}
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub(crate) enum Step {
Root(Root),
Field(String),
Position(u32),
Key,
Value,
Arm(u32),
}
impl Step {
pub fn of(source: &Source) -> Option<Self> {
match source {
Source::Field { name, .. } => Some(Self::Field(name.clone())),
Source::Position { position, .. } => Some(Self::Position(*position)),
Source::Key => Some(Self::Key),
Source::Value => Some(Self::Value),
Source::Flags { .. } | Source::Tag | Source::Arm => None,
}
}
}
impl fmt::Display for Step {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Root(Root::Declaration(name)) => f.write_str(name),
Self::Root(Root::Foreign { package, name }) => write!(f, "{package}.{name}"),
Self::Root(Root::Tuple(index)) => write!(f, "tuple {index}"),
Self::Field(name) => f.write_str(name),
Self::Position(position) => write!(f, "{position}"),
Self::Key => f.write_str("key"),
Self::Value => f.write_str("value"),
Self::Arm(ordinal) => write!(f, "{ordinal}"),
}
}
}