registerGateCallbacksSafely<TContext> function

Set<String> registerGateCallbacksSafely<TContext>(
  1. AuthGateRegistry<TContext> registry,
  2. Map<String, AuthGateCallback<TContext>> entries, {
  3. Set<String> managed = const <String>{},
})

Registers gate callbacks without overriding unmanaged existing entries.

Blank names are skipped. Existing entries are replaced only when their names are listed in managed; unmanaged duplicates are ignored. Returns the normalized names registered successfully.

Implementation

Set<String> registerGateCallbacksSafely<TContext>(
  AuthGateRegistry<TContext> registry,
  Map<String, AuthGateCallback<TContext>> entries, {
  Set<String> managed = const <String>{},
}) {
  final registered = <String>{};
  entries.forEach((ability, callback) {
    final trimmed = ability.trim();
    if (trimmed.isEmpty) {
      return;
    }

    final managedBefore = managed.contains(trimmed);
    if (managedBefore) {
      registry.unregister(trimmed);
    }

    try {
      registry.register(trimmed, callback);
    } on AuthGateRegistrationException {
      if (!managedBefore) {
        return;
      }
      rethrow;
    }

    registered.add(trimmed);
  });
  return registered;
}