use serde::{Deserialize, Serialize};
use super::{DiagnosticStage, Severity};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Diagnostic {
pub id: String,
pub severity: Severity,
pub stage: DiagnosticStage,
pub category: String,
pub message: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub object_ref: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub remediation: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub source_location: Option<String>,
}
impl Diagnostic {
pub fn error(
id: impl Into<String>,
category: impl Into<String>,
message: impl Into<String>,
) -> Self {
Self {
id: id.into(),
severity: Severity::Error,
stage: DiagnosticStage::Validation,
category: category.into(),
message: message.into(),
object_ref: None,
remediation: None,
source_location: None,
}
}
pub fn parse_error(id: impl Into<String>, message: impl Into<String>) -> Self {
Self {
id: id.into(),
severity: Severity::Error,
stage: DiagnosticStage::Parse,
category: crate::diagnostics::categories::SYNTAX.to_owned(),
message: message.into(),
object_ref: None,
remediation: None,
source_location: None,
}
}
pub fn warning(
id: impl Into<String>,
category: impl Into<String>,
message: impl Into<String>,
) -> Self {
Self {
id: id.into(),
severity: Severity::Warning,
stage: DiagnosticStage::Validation,
category: category.into(),
message: message.into(),
object_ref: None,
remediation: None,
source_location: None,
}
}
pub fn with_object_ref(mut self, object_ref: impl Into<String>) -> Self {
self.object_ref = Some(object_ref.into());
self
}
pub fn with_remediation(mut self, remediation: impl Into<String>) -> Self {
self.remediation = Some(remediation.into());
self
}
pub fn with_source_location(mut self, source_location: impl Into<String>) -> Self {
self.source_location = Some(source_location.into());
self
}
}