use alloc::{format, string::String, string::ToString, vec, vec::Vec};
use core::fmt;
use super::ValidationSeverity;
#[derive(Debug, Clone)]
pub struct StyleConflict<'a> {
pub styles: Vec<&'a str>,
pub conflict_type: ConflictType,
pub description: String,
pub severity: ValidationSeverity,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ConflictType {
DuplicateName,
CircularInheritance,
PropertyConflict,
MissingReference,
}
impl<'a> StyleConflict<'a> {
#[must_use]
pub fn new(
conflict_type: ConflictType,
styles: Vec<&'a str>,
description: &str,
severity: ValidationSeverity,
) -> Self {
Self {
styles,
conflict_type,
description: description.to_string(),
severity,
}
}
#[must_use]
pub fn duplicate_name(style_names: Vec<&'a str>) -> Self {
let description = format!("Duplicate style names found: {style_names:?}");
Self::new(
ConflictType::DuplicateName,
style_names,
&description,
ValidationSeverity::Error,
)
}
#[must_use]
pub fn circular_inheritance(cycle_styles: Vec<&'a str>) -> Self {
let description = format!("Circular inheritance detected: {cycle_styles:?}");
Self::new(
ConflictType::CircularInheritance,
cycle_styles,
&description,
ValidationSeverity::Error,
)
}
#[must_use]
pub fn missing_reference(referencing_style: &'a str, missing_style: &'a str) -> Self {
let description =
format!("Style '{referencing_style}' references non-existent style '{missing_style}'");
Self::new(
ConflictType::MissingReference,
vec![referencing_style],
&description,
ValidationSeverity::Error,
)
}
#[must_use]
pub fn missing_parent(style_name: &'a str, parent_name: &'a str) -> Self {
let description =
format!("Style '{style_name}' inherits from non-existent parent '{parent_name}'");
Self::new(
ConflictType::MissingReference,
vec![style_name],
&description,
ValidationSeverity::Warning,
)
}
}
impl fmt::Display for ConflictType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::DuplicateName => write!(f, "duplicate_name"),
Self::CircularInheritance => write!(f, "circular_inheritance"),
Self::PropertyConflict => write!(f, "property_conflict"),
Self::MissingReference => write!(f, "missing_reference"),
}
}
}