Obscura.rehydrate/2 restores vault tokens to original values through explicit vault access.

{:ok, text} = Obscura.rehydrate("Email <<EMAIL_001>>", vault: vault)

Missing vaults return an explicit error:

Obscura.rehydrate("Email <<EMAIL_001>>")
#=> {:error, :missing_vault}

Unknown token-like text is kept by default:

Obscura.rehydrate("Email <<EMAIL_999>>", vault: vault)
#=> {:ok, "Email <<EMAIL_999>>"}

Use unknown: :error to fail on unknown tokens.

Structured data is supported for maps, lists, keyword lists, and traversed structs:

Obscura.rehydrate(%{message: "Email <<EMAIL_001>>"}, vault: vault)

Keys are not rehydrated by default. Only binary values are rehydrated.