#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum MergeConflictKind {
Tool,
Resource,
ResourceTemplate,
Prompt,
}
impl MergeConflictKind {
pub fn as_str(&self) -> &'static str {
match self {
Self::Tool => "tool",
Self::Resource => "resource",
Self::ResourceTemplate => "resource template",
Self::Prompt => "prompt",
}
}
}
impl std::fmt::Display for MergeConflictKind {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.as_str())
}
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct MergeConflict {
pub kind: MergeConflictKind,
pub name: String,
}
impl MergeConflict {
pub(super) fn new(kind: MergeConflictKind, name: impl Into<String>) -> Self {
Self {
kind,
name: name.into(),
}
}
}
impl std::fmt::Display for MergeConflict {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{} '{}'", self.kind, self.name)
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct MergeConflicts {
pub(super) conflicts: Vec<MergeConflict>,
}
impl MergeConflicts {
pub fn conflicts(&self) -> &[MergeConflict] {
&self.conflicts
}
pub fn into_conflicts(self) -> Vec<MergeConflict> {
self.conflicts
}
}
impl std::fmt::Display for MergeConflicts {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "cannot merge routers: ")?;
for (index, conflict) in self.conflicts.iter().enumerate() {
if index > 0 {
f.write_str(", ")?;
}
write!(f, "{conflict}")?;
}
f.write_str(" defined by both")
}
}
impl std::error::Error for MergeConflicts {}