use std::collections::BTreeMap;
use crate::{Edge, NodeName};
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub enum Anchor {
Header,
Node(NodeName),
Config(NodeName, String),
ConfigTrailing(NodeName),
Edge(Edge),
GraphTrailing,
LayoutLeading,
LayoutEntry(NodeName),
LayoutTrailing,
FileTrailing,
}
impl Anchor {
pub(crate) fn node(&self) -> Option<&NodeName> {
match self {
Anchor::Node(n)
| Anchor::Config(n, _)
| Anchor::ConfigTrailing(n)
| Anchor::LayoutEntry(n) => Some(n),
Anchor::Edge(_)
| Anchor::Header
| Anchor::GraphTrailing
| Anchor::LayoutLeading
| Anchor::LayoutTrailing
| Anchor::FileTrailing => None,
}
}
pub(crate) fn with_node(&self, name: NodeName) -> Self {
match self {
Anchor::Node(_) => Anchor::Node(name),
Anchor::Config(_, pin) => Anchor::Config(name, pin.clone()),
Anchor::ConfigTrailing(_) => Anchor::ConfigTrailing(name),
Anchor::LayoutEntry(_) => Anchor::LayoutEntry(name),
other => other.clone(),
}
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct Trivia(pub(crate) BTreeMap<Anchor, Vec<String>>);
impl Trivia {
pub fn get(&self, anchor: &Anchor) -> &[String] {
self.0.get(anchor).map_or(&[], Vec::as_slice)
}
pub fn add(&mut self, anchor: Anchor, comments: Vec<String>) {
if comments.is_empty() {
return;
}
self.0.entry(anchor).or_default().extend(comments);
}
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
}