specfold_core/plugins/
protocol.rs1use crate::check::finding::{Fix, Severity};
5use serde::{Deserialize, Serialize};
6use serde_json::Value;
7
8pub const PROTOCOL: &str = "specfold.plugin.v1";
9
10#[derive(Debug, Clone, Serialize)]
11pub struct Request<'a> {
12 pub protocol: &'static str,
13 pub method: &'a str,
14 #[serde(skip_serializing_if = "Value::is_null")]
15 pub params: Value,
16}
17
18#[derive(Debug, Clone, Deserialize, Serialize, Default)]
19pub struct PluginRule {
20 pub id: String,
21 pub title: String,
22 #[serde(default)]
23 pub explain: String,
24 #[serde(default)]
25 pub on_commit: bool,
26}
27
28#[derive(Debug, Clone, Deserialize, Serialize, Default)]
29pub struct Provides {
30 #[serde(default)]
31 pub rules: Vec<PluginRule>,
32 #[serde(default)]
33 pub importers: Vec<String>,
34 #[serde(default)]
35 pub exporters: Vec<String>,
36 #[serde(default)]
37 pub audits: Vec<String>,
38 #[serde(default)]
39 pub events: Vec<String>,
40}
41
42#[derive(Debug, Clone, Deserialize, Serialize)]
43pub struct Description {
44 #[serde(default)]
45 pub protocol: String,
46 pub name: String,
47 #[serde(default)]
48 pub version: String,
49 #[serde(default)]
50 pub provides: Provides,
51}
52
53#[derive(Debug, Clone, Deserialize)]
55pub struct PluginFinding {
56 pub rule: String,
57 #[serde(default = "default_severity")]
58 pub severity: Severity,
59 pub path: String,
60 #[serde(default = "one")]
61 pub line: usize,
62 pub message: String,
63 pub fix: Option<Fix>,
64 #[serde(default)]
65 pub candidates: Vec<String>,
66}
67
68fn default_severity() -> Severity {
69 Severity::Error
70}
71
72fn one() -> usize {
73 1
74}
75
76#[derive(Debug, Clone, Deserialize)]
77pub struct FindingsResponse {
78 #[serde(default)]
79 pub findings: Vec<PluginFinding>,
80}