use serde::{Deserialize, Serialize};
use super::SourceLocation;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct DataSurface {
pub sources: Vec<TaintSource>,
pub sinks: Vec<TaintSink>,
pub taint_paths: Vec<TaintPath>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TaintSource {
pub source_type: TaintSourceType,
pub description: String,
pub location: SourceLocation,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum TaintSourceType {
ToolArgument,
PromptContent,
EnvVariable,
SecretStore,
HttpResponse,
FileContent,
DatabaseQuery,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TaintSink {
pub sink_type: TaintSinkType,
pub description: String,
pub location: SourceLocation,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum TaintSinkType {
ProcessExec,
DynamicEval,
HttpRequest,
FileWrite,
LogOutput,
DatabaseWrite,
ResponseToLlm,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TaintPath {
pub source: TaintSource,
pub sink: TaintSink,
pub through: Vec<SourceLocation>,
pub confidence: f32,
}