#![deny(clippy::all)]
#![warn(clippy::pedantic)]
#![deny(missing_docs)]
mod context;
mod json;
mod json_endpoint;
mod repro;
mod sarif;
mod sarif_builder;
#[cfg(not(target_arch = "wasm32"))]
mod table;
#[cfg(not(target_arch = "wasm32"))]
mod table_rows;
pub mod wire;
#[cfg(test)]
#[path = "repro_output_tests.rs"]
mod repro_output_tests;
#[cfg(test)]
#[path = "context_output_tests.rs"]
mod context_output_tests;
pub use context::{BodySamplesBundle, ExchangeContext, HeadersBundle, ProbeContext};
pub use json::{render_endpoint_verdict_json, render_json, render_scan_json};
pub use parlov_elicit::ChainProvenance;
pub use repro::build_curl;
pub use sarif::{render_endpoint_verdict_sarif, render_sarif, render_scan_sarif};
#[cfg(not(target_arch = "wasm32"))]
pub use table::{render_endpoint_verdict_table, render_scan_table, render_table};
use parlov_core::OracleResult;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct ReproInfo {
pub baseline_curl: String,
pub probe_curl: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct ScanFinding {
pub target_url: String,
pub strategy_id: String,
pub strategy_name: String,
pub method: String,
pub result: OracleResult,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub repro: Option<ReproInfo>,
pub probe: ProbeContext,
pub exchange: ExchangeContext,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub chain_provenance: Option<ChainProvenance>,
}