diff --git a/Cargo.lock b/Cargo.lock index ed430a4..7cbdc80 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -471,7 +471,7 @@ checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "pg_stage_rs" -version = "0.3.1" +version = "0.3.2" dependencies = [ "ahash", "chrono", diff --git a/Cargo.toml b/Cargo.toml index 3f83c47..01d071a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pg_stage_rs" -version = "0.3.1" +version = "0.3.2" edition = "2021" description = "PostgreSQL dump anonymizer - streaming obfuscation for plain and custom formats" diff --git a/src/mutator/contact.rs b/src/mutator/contact.rs index 21f974e..a0312ae 100644 --- a/src/mutator/contact.rs +++ b/src/mutator/contact.rs @@ -28,9 +28,12 @@ pub fn email(ctx: &mut MutationContext) -> Result { } pub fn phone_number(ctx: &mut MutationContext) -> Result { - let mask: &str = ctx.get_str_kwarg("mask").ok_or_else(|| { - PgStageError::MissingParameter("mask".to_string(), "phone_number".to_string()) - })?; + let mask: &str = ctx + .get_str_kwarg("mask") + .or_else(|| ctx.get_str_kwarg("format")) + .ok_or_else(|| { + PgStageError::MissingParameter("mask".to_string(), "phone_number".to_string()) + })?; let unique = ctx.get_bool_kwarg("unique"); let mask_bytes = mask.as_bytes(); let mut gen = || { diff --git a/tests/integration.rs b/tests/integration.rs index fd3e3d2..195e5d3 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -151,6 +151,25 @@ fn test_plain_mutation_phone_number() { assert_eq!(parts[1].len(), "+1 (###) ###-####".len()); } +#[test] +fn test_plain_mutation_phone_number_format_alias() { + let input = concat!( + "COMMENT ON COLUMN public.users.phone IS 'anon: [{\"mutation_name\": \"phone_number\", \"mutation_kwargs\": {\"format\": \"+1 (###) ###-####\"}}]';\n", + "COPY public.users (id, phone) FROM stdin;\n", + "1\t+1 (555) 123-4567\n", + "\\.\n", + ); + let mut output = Vec::new(); + let mut handler = PlainHandler::new(make_processor()); + handler.process(Cursor::new(b""), &mut output, input.as_bytes()).unwrap(); + let result = String::from_utf8(output).unwrap(); + let lines: Vec<&str> = result.lines().collect(); + let data_line = lines.iter().find(|l| l.starts_with("1\t")).unwrap(); + let parts: Vec<&str> = data_line.split('\t').collect(); + assert!(parts[1].starts_with("+1 (")); + assert_eq!(parts[1].len(), "+1 (###) ###-####".len()); +} + #[test] fn test_plain_mutation_uuid4() { let input = concat!(