#![allow(missing_docs)]
mod contract;
mod semantics;
pub mod expr;
use serde::{Deserialize, Serialize};
use crate::diagnostics::Diagnostic;
pub use contract::check_contract;
pub use expr::check_expression;
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AnalysisReport {
pub diagnostics: Vec<Diagnostic>,
pub findings: Vec<AnalysisFinding>,
}
impl AnalysisReport {
#[must_use]
pub fn is_valid(&self) -> bool {
!self.diagnostics.iter().any(|d| d.severity.is_error())
}
pub(crate) fn merge(&mut self, mut other: AnalysisReport) {
self.diagnostics.append(&mut other.diagnostics);
self.findings.append(&mut other.findings);
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AnalysisFinding {
pub object_ref: String,
pub kind: String,
pub message: String,
#[serde(default, skip_serializing_if = "std::collections::BTreeMap::is_empty")]
pub attributes: std::collections::BTreeMap<String, serde_json::Value>,
}