Anvil.PII.Redactor (Anvil v0.1.1)

View Source

Redaction strategies for PII fields during export.

This module applies various redaction policies to field values to protect sensitive information while preserving analytical value.

Redaction Strategies

  • :preserve - Keep field unchanged (explicit opt-in)
  • :strip - Remove field entirely (returns nil)
  • :truncate - Truncate to first N characters
  • :hash - Hash value (preserves uniqueness for grouping)
  • :regex_redact - Apply regex-based redaction patterns

Examples

iex> Anvil.PII.Redactor.redact("sensitive text", :strip)
nil

iex> Anvil.PII.Redactor.redact("long text here", :truncate, max_length: 10)
"long text "

iex> Anvil.PII.Redactor.redact("test@example.com", :hash)
"a7b2c3..." # SHA256 hash

Summary

Functions

Returns the default PII detection patterns.

Detects potential PII in a string value using regex patterns.

Applies a redaction policy to a field value.

Redacts a map of field values based on field metadata.

Types

redaction_opts()

@type redaction_opts() :: keyword()

redaction_policy()

@type redaction_policy() :: :preserve | :strip | :truncate | :hash | :regex_redact

Functions

default_patterns()

@spec default_patterns() :: [{Regex.t(), String.t()}]

Returns the default PII detection patterns.

Each pattern is a tuple of {regex, replacement_text}.

detect_pii(value)

@spec detect_pii(String.t()) :: [atom()]

Detects potential PII in a string value using regex patterns.

Returns a list of detected PII types.

Examples

iex> Anvil.PII.Redactor.detect_pii("Contact me at test@example.com")
[:email]

iex> Anvil.PII.Redactor.detect_pii("Call 555-123-4567")
[:phone]

iex> Anvil.PII.Redactor.detect_pii("No PII here")
[]

redact(value, policy, opts \\ [])

@spec redact(any(), redaction_policy(), redaction_opts()) :: any()

Applies a redaction policy to a field value.

Options

  • :max_length - Maximum length for :truncate policy (default: 100)
  • :patterns - List of {regex, replacement} tuples for :regex_redact (default: common PII patterns)
  • :salt - Salt for hashing (default: nil)

Examples

iex> Anvil.PII.Redactor.redact("value", :preserve)
"value"

iex> Anvil.PII.Redactor.redact("value", :strip)
nil

iex> Anvil.PII.Redactor.redact("long text", :truncate, max_length: 4)
"long"

iex> Anvil.PII.Redactor.redact("test", :hash)
"9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"

redact_payload(payload, field_metadata_map, redaction_mode, opts \\ [])

@spec redact_payload(map(), map(), :none | :automatic | :aggressive, keyword()) ::
  map()

Redacts a map of field values based on field metadata.

Parameters

  • payload - Map of field names to values
  • field_metadata_map - Map of field names to metadata maps
  • redaction_mode - Redaction mode (:none, :automatic, :aggressive)
  • opts - Additional options passed to redaction functions

Examples

iex> payload = %{"name" => "John", "age" => 30}
iex> metadata = %{
...>   "name" => %{pii: :definite, redaction_policy: :strip},
...>   "age" => %{pii: :none}
...> }
iex> Anvil.PII.Redactor.redact_payload(payload, metadata, :automatic)
%{"age" => 30}