use er7_redact::{Action, Policy, Posture, Redactor, Unrecognised};
fn main() -> Result<(), er7_redact::Error> {
let built = Policy::accept_all()
.with("PID-3.1", Action::Pseudonym)?
.with("PID-5", Action::redacted())?
.with("PID-7", Action::First(4))?
.with("PID-19", Action::Clear)?;
let read = Policy::parse(
"
PID-3.1 pseudonym # keep linkage, lose the record number
PID-5 replace REDACTED
PID-7 first 4 # the birth year is enough for most tests
PID-19 clear
",
)?;
assert_eq!(built.rules, read.rules);
assert_eq!(built.posture, Posture::Accept);
assert_eq!(read.posture, Posture::Accept);
assert_eq!(built.unrecognised, Unrecognised::Pass);
assert_eq!(read.unrecognised, Unrecognised::Refuse);
let built = built.on_unrecognised(Unrecognised::Refuse);
assert_eq!(built, read);
let extended = Policy::patient_identifiers()
.with("NTE-3", Action::Clear)? .with("OBX-5", Action::Clear)?;
assert_eq!(
extended.rules.len(),
Policy::patient_identifiers().rules.len() + 2
);
println!("{built}");
assert_eq!(Policy::parse(&built.to_string())?, built);
let text = "MSH|^~\\&|LAB\rPID|1||PATID1234||EVERYWOMAN^EVE||19610615|F";
let mut message = er7::parse(text)?;
Redactor::new(built).redact(&mut message);
assert_eq!(message.query("PID-5.1")?.as_deref(), Some("REDACTED"));
let error = Policy::parse("PID-5 obfuscate").unwrap_err();
println!("{error}");
assert!(error.to_string().contains("policy line 1"));
Ok(())
}