redactEmail method

  1. @useResult
String redactEmail({
  1. int localPartVisible = 3,
  2. String maskChar = '*',
})

Redacts an email-like string to something like j***@example.com.

If this string contains exactly one @, shows the first character of the local part, then maskChar repeated localPartVisible times (default 3), then @ and the domain unchanged. Otherwise returns maskChar repeated by length (no structure assumed).

Throws ArgumentError if maskChar is empty or localPartVisible is negative.

Example:

'user@example.com'.redactEmail();     // 'u***@example.com'
'a@b.co'.redactEmail(maskChar: 'x');  // 'axxx@b.co'

Implementation

@useResult
String redactEmail({
  int localPartVisible = 3,
  String maskChar = '*',
}) {
  if (maskChar.isEmpty) {
    throw ArgumentError(_kErrMaskCharNonEmpty, _kParamMaskChar);
  }
  if (localPartVisible < 0) {
    throw ArgumentError(_kErrLocalPartVisibleNonNegative, _kParamLocalPartVisible);
  }
  if (isEmpty) return this;
  final int at = indexOf('@');
  if (at <= 0 || at != lastIndexOf('@')) {
    return maskChar * length;
  }
  final String local = substring(0, at);
  final String domain = substring(at);
  final String first = local.isEmpty ? '' : local[0];
  final String rest = maskChar * (localPartVisible > 0 ? localPartVisible : 0);
  return first + rest + domain;
}