use std::fmt::{self, Display, Formatter};
use crate::error::{UnknownField, ValidationError};
use crate::loader::SourceTrace;
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct DeprecatedField {
pub path: String,
pub source: Option<SourceTrace>,
pub note: Option<String>,
}
impl DeprecatedField {
#[must_use]
pub fn new(path: impl Into<String>) -> Self {
Self {
path: path.into(),
source: None,
note: None,
}
}
#[must_use]
pub fn with_source(mut self, source: Option<SourceTrace>) -> Self {
self.source = source;
self
}
#[must_use]
pub fn with_note(mut self, note: Option<String>) -> Self {
self.note = note;
self
}
}
impl Display for DeprecatedField {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write!(f, "deprecated field `{}`", self.path)?;
if let Some(source) = &self.source {
write!(f, " from {source}")?;
}
if let Some(note) = &self.note {
write!(f, "; {note}")?;
}
Ok(())
}
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct AppliedMigration {
pub kind: String,
pub from_version: u32,
pub to_version: u32,
pub from_path: String,
pub to_path: Option<String>,
pub note: Option<String>,
}
impl Display for AppliedMigration {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match &self.to_path {
Some(to_path) => {
write!(
f,
"{} {} -> {} (v{} -> v{})",
self.kind, self.from_path, to_path, self.from_version, self.to_version
)?;
}
None => {
write!(
f,
"{} {} (v{} -> v{})",
self.kind, self.from_path, self.from_version, self.to_version
)?;
}
}
if let Some(note) = &self.note {
write!(f, "; {note}")?;
}
Ok(())
}
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum ConfigWarning {
UnknownField(UnknownField),
DeprecatedField(DeprecatedField),
Validation(ValidationError),
}
impl Display for ConfigWarning {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self {
Self::UnknownField(field) => Display::fmt(field, f),
Self::DeprecatedField(field) => Display::fmt(field, f),
Self::Validation(error) => Display::fmt(error, f),
}
}
}