cloakpipe_core/
replacer.rs1use crate::{DetectedEntity, PseudonymizedText, vault::Vault};
7use anyhow::Result;
8use std::collections::HashMap;
9
10pub struct Replacer;
11
12impl Replacer {
13 pub fn pseudonymize(
16 text: &str,
17 entities: &[DetectedEntity],
18 vault: &mut Vault,
19 ) -> Result<PseudonymizedText> {
20 let mut result = String::with_capacity(text.len());
21 let mut mappings = HashMap::new();
22 let mut last_end = 0;
23
24 for entity in entities {
25 if entity.start > last_end {
27 result.push_str(&text[last_end..entity.start]);
28 }
29
30 let token = vault.get_or_create(&entity.original, &entity.category);
32
33 mappings.insert(token.token.clone(), entity.original.clone());
35
36 result.push_str(&token.token);
38 last_end = entity.end;
39 }
40
41 if last_end < text.len() {
43 result.push_str(&text[last_end..]);
44 }
45
46 Ok(PseudonymizedText {
47 text: result,
48 mappings,
49 entities: entities.to_vec(),
50 })
51 }
52}