use serde::{Deserialize, Serialize};
use crate::rules::Expression;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum TypeCheck {
Str,
Int,
Bool,
Float,
Email,
Url,
Uuid,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum TaintScope {
Session,
Message,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ScanKind {
PiiRedact,
PiiDetect,
InjectionScan,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Stage {
Type(TypeCheck),
Regex {
pattern: String,
},
Validate {
name: String,
},
Length {
min: Option<usize>,
max: Option<usize>,
},
Range {
min: Option<i64>,
max: Option<i64>,
},
Enum {
values: Vec<String>,
},
Mask {
keep_last: usize,
},
Redact {
condition: Option<Expression>,
},
Omit,
Hash,
Taint {
label: String,
scopes: Vec<TaintScope>,
},
Plugin {
name: String,
},
Scan {
kind: ScanKind,
},
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct Pipeline {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub stages: Vec<Stage>,
}
impl Pipeline {
pub fn new() -> Self {
Self::default()
}
pub fn push(&mut self, stage: Stage) {
self.stages.push(stage);
}
pub fn is_empty(&self) -> bool {
self.stages.is_empty()
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FieldRule {
pub field: String,
pub pipeline: Pipeline,
pub source: String,
}
#[derive(Debug, Clone, PartialEq)]
pub struct TaintEvent {
pub label: String,
pub scopes: Vec<TaintScope>,
}