use crate::link_network::{Link, LinkType};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum NetworkProjection {
Lossless,
ConcreteSyntax,
AbstractSyntax,
Semantic,
}
impl NetworkProjection {
#[must_use]
pub const fn label(self) -> &'static str {
match self {
Self::Lossless => "lossless",
Self::ConcreteSyntax => "concrete syntax",
Self::AbstractSyntax => "abstract syntax",
Self::Semantic => "semantic",
}
}
pub(crate) fn includes(self, link: &Link) -> bool {
match self {
Self::Lossless => true,
Self::ConcreteSyntax => link.metadata().link_type() != Some(LinkType::Semantic),
Self::AbstractSyntax => !matches!(
link.metadata().link_type(),
Some(LinkType::Token | LinkType::Trivia)
),
Self::Semantic => matches!(
link.metadata().link_type(),
Some(LinkType::Semantic | LinkType::Concept | LinkType::Type | LinkType::Language)
),
}
}
}