pub mod error;
pub mod request;
pub mod response;
pub use error::{ApiError, ErrorResponse};
pub use request::{
AnonymizeRequest, BatchScanRequest, DeanonymizeRequest, ScanOutputRequest, ScanPromptRequest,
};
pub use response::{
AnonymizeResponse, AnonymizedEntityDto, BatchScanResponse, DeanonymizeResponse, EntityDto,
ListScannersResponse, RiskFactorDto, ScanResponse, ScannerMetadataResponse, ScannerResult,
};
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ApiResponse<T> {
pub success: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<T>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<ErrorResponse>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<ResponseMetadata>,
}
impl<T> ApiResponse<T> {
pub fn success(data: T) -> Self {
Self {
success: true,
data: Some(data),
error: None,
metadata: None,
}
}
pub fn success_with_metadata(data: T, metadata: ResponseMetadata) -> Self {
Self {
success: true,
data: Some(data),
error: None,
metadata: Some(metadata),
}
}
pub fn error(error: ErrorResponse) -> Self {
Self {
success: false,
data: None,
error: Some(error),
metadata: None,
}
}
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ResponseMetadata {
pub request_id: String,
pub processing_time_ms: u64,
pub version: String,
pub timestamp: String,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_api_response_success() {
let response = ApiResponse::success("test data");
assert!(response.success);
assert_eq!(response.data, Some("test data"));
assert!(response.error.is_none());
}
#[test]
fn test_api_response_error() {
let error = ErrorResponse {
code: "TEST_ERROR".to_string(),
message: "Test error message".to_string(),
details: None,
};
let response: ApiResponse<()> = ApiResponse::error(error.clone());
assert!(!response.success);
assert!(response.data.is_none());
assert_eq!(response.error.unwrap().code, "TEST_ERROR");
}
#[test]
fn test_api_response_serialization() {
let response = ApiResponse::success("test");
let json = serde_json::to_string(&response).unwrap();
assert!(json.contains("\"success\":true"));
assert!(json.contains("\"data\":\"test\""));
}
}