use serde::{Deserialize, Serialize};
use super::identifiers::is_vendor_namespaced_identifier;
use super::metadata::Metadata;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum RulePhase {
Precondition,
Execution,
Postcondition,
}
impl RulePhase {
#[must_use]
pub fn as_str(self) -> &'static str {
match self {
Self::Precondition => "precondition",
Self::Execution => "execution",
Self::Postcondition => "postcondition",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Rule {
pub id: String,
pub rule: String,
pub target: String,
pub phase: RulePhase,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
}
pub const KNOWN_RULES: &[&str] = &["dtcs:not_null"];
#[must_use]
pub fn is_known_rule(rule: &str) -> bool {
KNOWN_RULES.contains(&rule) || is_vendor_namespaced_identifier(rule)
}