parsePolicies function

Map<String, Map<String, Object?>> parsePolicies(
  1. String policiesIdl
)

Parses a set of Cedar policies from the given policiesIdl using the Cedar Rust engine via FFI.

Implementation

Map<String, Map<String, Object?>> parsePolicies(String policiesIdl) {
  return using((arena) {
    final cPolicies = bindings.cedar_parse_policy_set(
      policiesIdl.toNativeUtf8(allocator: arena).cast(),
    );
    switch (cPolicies) {
      case CCedarPolicySetResult(:final errors, :final errors_len)
          when errors_len > 0:
        final errorStrings = <String>[];
        for (var i = 0; i < errors_len; i++) {
          errorStrings.add(errors[i].cast<Utf8>().toDartString());
        }
        throw FormatException(
          'Error parsing policies: '
          '${errorStrings.join(', ')}',
          policiesIdl,
        );
      case CCedarPolicySetResult(
          :final policies,
          :final policy_ids,
          :final policies_len,
          :final templates,
          :final template_ids,
          :final templates_len,
        ):
        return {
          for (var i = 0; i < policies_len; i++)
            policy_ids[i].cast<Utf8>().toDartString():
                jsonDecode(policies[i].cast<Utf8>().toDartString())
                    as Map<String, Object?>,
          for (var i = 0; i < templates_len; i++)
            template_ids[i].cast<Utf8>().toDartString():
                jsonDecode(templates[i].cast<Utf8>().toDartString())
                    as Map<String, Object?>,
        };
    }
  });
}