evaluateState method

AsyncValue<bool> evaluateState(
  1. UserSecurityContext context,
  2. ZenithPolicy policy, {
  3. PolicyRef? ref,
})

Shared evaluation for route guards and reactive authorization widgets.

Implementation

AsyncValue<bool> evaluateState(
  UserSecurityContext context,
  ZenithPolicy policy, {
  PolicyRef? ref,
}) {
  final requirements = policy.requirements ?? const <ZenithRequirement>[];
  if (requirements.isEmpty &&
      policy.evaluate == null &&
      policy.evaluateAsync == null) {
    return const AsyncData(false);
  }
  try {
    for (final requirement in requirements) {
      if (!requirement.evaluate(context)) return const AsyncData(false);
    }
    final policyRef = ref ?? PolicyRef();
    if (policy.evaluate != null && !policy.evaluate!(policyRef)) {
      return const AsyncData(false);
    }
    return policy.evaluateAsync?.call(policyRef) ?? const AsyncData(true);
  } catch (_) {
    return const AsyncData(false);
  }
}