1pub mod context;
7pub mod decision;
8pub mod engine;
9pub mod error;
10pub mod ir;
11pub mod proof;
12pub mod rules;
13pub mod vm;
14
15use serde::{Deserialize, Serialize};
16
17#[derive(Debug, Clone, Serialize, Deserialize)]
19pub struct EvaluationRequest {
20 pub request_id: String,
22 pub agent_id: String,
24 pub agent_org: String,
25 pub agent_level: String,
26 pub mission_id: Option<String>,
28 pub mission_type: Option<String>,
29 pub query_type: Option<String>,
31 pub justification: Option<String>,
32 pub export_format: Option<String>,
33 pub result_limit: Option<u32>,
34 pub requests_last_hour: u32,
36 pub requests_last_24h: u32,
37 pub results_last_query: u32,
38 pub account_department: Option<String>,
40 pub allowed_departments: Vec<u32>,
41 pub request_hour: u32,
43 pub is_within_mission_hours: bool,
44}
45
46#[derive(Debug, Clone, Serialize, Deserialize)]
48pub struct EvaluationResult {
49 pub request_id: String,
51 pub decision: decision::Decision,
53 pub error_code: Option<String>,
55 pub message: Option<String>,
57 pub rule_id: Option<String>,
59 pub rule_version: Option<String>,
61 pub evaluated_at: String,
63 pub evaluation_time_ms: u64,
65}
66
67impl Default for EvaluationResult {
68 fn default() -> Self {
69 EvaluationResult {
70 request_id: String::new(),
71 decision: decision::Decision::Allow,
72 error_code: None,
73 message: None,
74 rule_id: None,
75 rule_version: None,
76 evaluated_at: chrono::Utc::now().to_rfc3339(),
77 evaluation_time_ms: 0,
78 }
79 }
80}
81
82#[cfg(test)]
83mod tests {
84 use super::*;
85
86 #[test]
87 fn test_default_result() {
88 let result = EvaluationResult::default();
89 assert_eq!(result.decision, decision::Decision::Allow);
90 }
91
92 #[test]
93 fn test_evaluation_request_serialization() {
94 let request = EvaluationRequest {
95 request_id: "req_001".to_string(),
96 agent_id: "AGENT_001".to_string(),
97 agent_org: "DGFiP".to_string(),
98 agent_level: "standard".to_string(),
99 mission_id: Some("MIS_001".to_string()),
100 mission_type: Some("FISCAL".to_string()),
101 query_type: Some("SEARCH_BY_NAME".to_string()),
102 justification: Some("EnquĂȘte".to_string()),
103 export_format: None,
104 result_limit: Some(50),
105 requests_last_hour: 10,
106 requests_last_24h: 100,
107 results_last_query: 5,
108 account_department: Some("75".to_string()),
109 allowed_departments: vec![75, 92, 93],
110 request_hour: 14,
111 is_within_mission_hours: true,
112 };
113
114 let json = serde_json::to_string(&request).unwrap();
115 assert!(json.contains("AGENT_001"));
116 }
117}