eth_id/privacy/
minimizer.rs1use crate::error::{Result, EthIdError};
2use crate::parser::ParsedDocument;
3use crate::claims::{ClaimQuery, ClaimType};
4
5pub struct DataMinimizer;
6
7impl DataMinimizer {
8 pub fn new() -> Self {
9 Self
10 }
11
12 pub fn extract_relevant_fields(
13 &self,
14 document: &ParsedDocument,
15 claim_query: &ClaimQuery,
16 ) -> Result<Vec<String>> {
17 let mut relevant_fields = Vec::new();
18
19 match claim_query.claim_type() {
20 ClaimType::Date => {
21 relevant_fields.push("date_of_birth".to_string());
22 relevant_fields.push("expiry_date".to_string());
23 }
24 ClaimType::Identity => {
25 relevant_fields.push("name".to_string());
26 relevant_fields.push("cpf".to_string());
27 relevant_fields.push("rg".to_string());
28 }
29 ClaimType::Amount => {
30 relevant_fields.push("amount".to_string());
31 }
32 ClaimType::Signature => {
33 relevant_fields.push("signature".to_string());
34 }
35 ClaimType::Presence => {}
36 ClaimType::Comparative => {}
37 }
38
39 relevant_fields.retain(|field| document.get_field(field).is_some());
40
41 Ok(relevant_fields)
42 }
43
44 pub fn build_minimal_context(
45 &self,
46 document: &ParsedDocument,
47 fields: &[String],
48 ) -> Result<String> {
49 let mut context = String::new();
50
51 for field in fields {
52 if let Some(value) = document.get_field(field) {
53 context.push_str(&format!("{}: {}\n", field, value));
54 }
55 }
56
57 if context.is_empty() {
58 context = self.extract_minimal_text(document.raw_text());
59 }
60
61 Ok(context)
62 }
63
64 fn extract_minimal_text(&self, text: &str) -> String {
65 let lines: Vec<&str> = text.lines()
66 .filter(|line| !line.trim().is_empty())
67 .take(20)
68 .collect();
69
70 lines.join("\n")
71 }
72}