Skip to main content

eth_id/privacy/
minimizer.rs

1use 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}