diff --git a/policy/src/main/java/dev/cel/policy/BUILD.bazel b/policy/src/main/java/dev/cel/policy/BUILD.bazel index e878e1be6..7b0ee71ab 100644 --- a/policy/src/main/java/dev/cel/policy/BUILD.bazel +++ b/policy/src/main/java/dev/cel/policy/BUILD.bazel @@ -167,7 +167,9 @@ java_library( ], deps = [ ":policy", + "//:auto_value", "//common/formats:parser_context", + "//policy:source", ], ) diff --git a/policy/src/main/java/dev/cel/policy/CelPolicyYamlParser.java b/policy/src/main/java/dev/cel/policy/CelPolicyYamlParser.java index e56e12169..fa2e39c42 100644 --- a/policy/src/main/java/dev/cel/policy/CelPolicyYamlParser.java +++ b/policy/src/main/java/dev/cel/policy/CelPolicyYamlParser.java @@ -94,11 +94,17 @@ private CelPolicy parseYaml() throws CelPolicyValidationException { } @Override - public CelPolicy parsePolicy(PolicyParserContext ctx, Node node) { - CelPolicy.Builder policyBuilder = CelPolicy.newBuilder(); + public NewPolicyMetadata newPolicy(Node node) { long id = ctx.collectMetadata(node); - if (!assertYamlType(ctx, id, node, YamlNodeType.MAP)) { - return policyBuilder.setPolicySource(policySource).build(); + return NewPolicyMetadata.create(policySource, id); + } + + @Override + public CelPolicy parsePolicy(PolicyParserContext ctx, Node node) { + NewPolicyMetadata newPolicyMetadata = newPolicy(node); + CelPolicy.Builder policyBuilder = newPolicyMetadata.policyBuilder(); + if (!assertYamlType(ctx, newPolicyMetadata.id(), node, YamlNodeType.MAP)) { + return policyBuilder.build(); } MappingNode rootNode = (MappingNode) node; diff --git a/policy/src/main/java/dev/cel/policy/PolicyParserContext.java b/policy/src/main/java/dev/cel/policy/PolicyParserContext.java index 0f421efe7..204bf591f 100644 --- a/policy/src/main/java/dev/cel/policy/PolicyParserContext.java +++ b/policy/src/main/java/dev/cel/policy/PolicyParserContext.java @@ -14,6 +14,7 @@ package dev.cel.policy; +import com.google.auto.value.AutoValue; import dev.cel.common.formats.ParserContext; import dev.cel.policy.CelPolicy.Match; import dev.cel.policy.CelPolicy.Rule; @@ -24,6 +25,25 @@ * for {@link CelPolicy}. */ public interface PolicyParserContext extends ParserContext { + + /** + * Wrapper for a new instance of {@link CelPolicy.Builder} and the associated node ID. The + * CelPolicy builder also has a policy source set by the parser. + */ + @AutoValue + abstract class NewPolicyMetadata { + public abstract CelPolicy.Builder policyBuilder(); + + public abstract long id(); + + static NewPolicyMetadata create(CelPolicySource source, long id) { + return new AutoValue_PolicyParserContext_NewPolicyMetadata( + CelPolicy.newBuilder().setPolicySource(source), id); + } + } + + NewPolicyMetadata newPolicy(T node); + CelPolicy parsePolicy(PolicyParserContext ctx, T node); Rule parseRule(PolicyParserContext ctx, CelPolicy.Builder policyBuilder, T node);