use std::fmt;
use crate::identity::Key;
use crate::ids::{CategoryId, ConsequenceId, DriverId, ElementId, OptionId, TagId};
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum ConflictOwner {
Element(ElementId),
Option(OptionId),
Driver(DriverId),
Consequence(ConsequenceId),
Tag(TagId),
Category(CategoryId),
Manifest,
Labels,
}
impl ConflictOwner {
#[must_use]
pub const fn key(self) -> Option<Key> {
Some(match self {
Self::Element(element) => element.key(),
Self::Option(option) => option.key(),
Self::Driver(driver) => driver.key(),
Self::Consequence(consequence) => consequence.key(),
Self::Tag(tag) => tag.key(),
Self::Category(category) => category.key(),
Self::Manifest | Self::Labels => return None,
})
}
}
impl fmt::Display for ConflictOwner {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Element(element) => write!(formatter, "{element}"),
Self::Option(option) => write!(formatter, "option {option}"),
Self::Driver(driver) => write!(formatter, "driver {driver}"),
Self::Consequence(consequence) => write!(formatter, "consequence {consequence}"),
Self::Tag(tag) => write!(formatter, "tag entry {tag}"),
Self::Category(category) => write!(formatter, "category entry {category}"),
Self::Manifest => formatter.write_str("the manifest"),
Self::Labels => formatter.write_str("the bindings"),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct FieldPath(String);
impl FieldPath {
#[must_use]
pub fn new(path: impl Into<String>) -> Self {
Self(path.into())
}
#[must_use]
pub fn as_str(&self) -> &str {
&self.0
}
}
impl fmt::Display for FieldPath {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(&self.0)
}
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum ConflictValue {
Deleted,
Scalar(String),
List(Vec<Self>),
Record(Vec<(String, Self)>),
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Conflict {
pub owner: ConflictOwner,
pub field: FieldPath,
pub base: Option<ConflictValue>,
pub ours: Option<ConflictValue>,
pub theirs: Option<ConflictValue>,
}