#![allow(missing_docs)]
use crate::ast::{Span, SpecFile};
pub mod codes {
pub const E_NO_PROGRESS: &str = "rpmspec/E0001";
pub const E_UNTERMINATED_CONDITIONAL: &str = "rpmspec/E0002";
pub const E_RICH_DEP_MIXED_OPS: &str = "rpmspec/E0003";
pub const E_RICH_DEP_UNBALANCED: &str = "rpmspec/E0004";
pub const E_RICH_DEP_EMPTY_OPERAND: &str = "rpmspec/E0005";
pub const E_DEP_ATOM_NO_NAME: &str = "rpmspec/E0006";
pub const E_PACKAGE_NEEDS_NAME: &str = "rpmspec/E0007";
pub const E_ELSE_WITHOUT_IF: &str = "rpmspec/E0008";
pub const E_UNEXPECTED_OP_IF_UNLESS: &str = "rpmspec/E0009";
pub const E_RICH_DEP_WITHOUT_ARITY: &str = "rpmspec/E0010";
pub const W_STRAY_PERCENT: &str = "rpmspec/W0001";
pub const W_LINE_NOT_RECOGNIZED: &str = "rpmspec/W0002";
pub const W_BUILTIN_MISSING_BODY: &str = "rpmspec/W0003";
pub const W_UNTERMINATED_MACRO: &str = "rpmspec/W0004";
pub const W_MULTIPLE_ELSE: &str = "rpmspec/W0005";
pub const W_ELIF_AFTER_ELSE: &str = "rpmspec/W0006";
pub const W_EMPTY_DEP: &str = "rpmspec/W0007";
pub const W_UNKNOWN_SCRIPTLET_TOKEN: &str = "rpmspec/W0008";
pub const W_SCRIPTLET_DASHES_INVALID: &str = "rpmspec/W0009";
pub const W_EXPECTED_FILELIST: &str = "rpmspec/W0010";
pub const W_EXPECTED_INTERP: &str = "rpmspec/W0011";
pub const W_EXPECTED_PRIORITY: &str = "rpmspec/W0012";
pub const W_EXPECTED_NAME_AFTER_N: &str = "rpmspec/W0013";
pub const W_EXPECTED_FILE_AFTER_F: &str = "rpmspec/W0014";
pub const W_TRIGGER_MISSING_DASHES: &str = "rpmspec/W0015";
pub const W_FILE_TRIGGER_MISSING_DASHES: &str = "rpmspec/W0016";
pub const W_INVALID_BOOL: &str = "rpmspec/W0017";
pub const W_INVALID_NUMBER: &str = "rpmspec/W0018";
pub const W_LINE_NOT_RECOGNIZED_IN_FILES: &str = "rpmspec/W0019";
pub const W_LINE_NOT_RECOGNIZED_IN_PACKAGE: &str = "rpmspec/W0020";
pub const W_MACRO_EMPTY_NAME: &str = "rpmspec/W0021";
pub const W_UNEXPECTED_LINE_IN_CHANGELOG: &str = "rpmspec/W0022";
pub const W_MALFORMED_CHANGELOG_HEADER: &str = "rpmspec/W0023";
pub const W_DEFERRED_SECTION: &str = "rpmspec/W0024";
pub const W_IMPLAUSIBLE_CHANGELOG_DATE: &str = "rpmspec/W0025";
}
#[derive(Debug, Clone, PartialEq, Eq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(deny_unknown_fields))]
#[non_exhaustive]
pub struct ParseResult<T = ()> {
pub spec: SpecFile<T>,
pub diagnostics: Vec<Diagnostic>,
}
impl<T> ParseResult<T> {
pub fn new(spec: SpecFile<T>) -> Self
where
Vec<Diagnostic>: Default,
{
Self {
spec,
diagnostics: Vec::new(),
}
}
pub fn with_diagnostics(mut self, diagnostics: Vec<Diagnostic>) -> Self {
self.diagnostics = diagnostics;
self
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(deny_unknown_fields))]
#[non_exhaustive]
pub struct Diagnostic {
pub severity: Severity,
pub code: Option<String>,
pub span: Option<Span>,
pub message: String,
pub notes: Vec<String>,
}
impl Diagnostic {
pub fn warning(message: impl Into<String>) -> Self {
Self {
severity: Severity::Warning,
code: None,
span: None,
message: message.into(),
notes: Vec::new(),
}
}
pub fn error(message: impl Into<String>) -> Self {
Self {
severity: Severity::Error,
code: None,
span: None,
message: message.into(),
notes: Vec::new(),
}
}
#[must_use]
pub fn with_span(mut self, span: Span) -> Self {
self.span = Some(span);
self
}
#[must_use]
pub fn with_code(mut self, code: impl Into<String>) -> Self {
self.code = Some(code.into());
self
}
#[must_use]
pub fn with_note(mut self, note: impl Into<String>) -> Self {
self.notes.push(note.into());
self
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[non_exhaustive]
pub enum Severity {
Warning,
Error,
}