Skip to content

[Feature Request] Bitwise operation support in predefined CEL rules #246

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
KeXiangWang opened this issue May 8, 2025 · 3 comments
Open
Labels
Feature New feature or request

Comments

@KeXiangWang
Copy link

Feature description:
Support bitwise operations in predefined CEL rules.

For example,

extend buf.validate.Int32Rules {
  optional bool power_of_two = 100000 [(buf.validate.predefined).cel = {
    id: "int32.power_of_two"
    message: "value must be a power of two"
    expression: "this >= 0 && (this & (this - 1)) == 0"
  }];
}

although the above rules can be successfully complied by protoc, when execute, I got this error:

compilation error: failed to compile standard rule "xxxxx.power_of_two": compilation error: failed to compile expression int32.power_of_two: ERROR: <input>:1:20: Syntax error: token recognition error at: '& '
 | this >= 0 && (this & (this - 1)) == 0

I think CEL itself support bitwise operations? I'm not sure whether protovalidate disable it or there's some reason it doesn't work.

My toolchain version:
protoc: libprotoc 3.21.9
validate.proto: https://github.com/bufbuild/protovalidate/blob/51ee9b3a85ed11c19a2b8023aa2520cca82f431e/proto/protovalidate/buf/validate/validate.proto
protovalidate-go: buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250425153114-8976f5be98c1.1

Problem it solves or use case:
When predefining some more complicated rules.

Proposed implementation or solution:
Although cel-spec hasn't support bitwise operations. They provide go-implenmation for this as an extension. See https://github.com/google/cel-go/blob/f6d3c92171c2c8732a8d0a4b24d6729df4261520/ext/math.go#L95. It should not be hard to support this new operations just like other extension rules.

Contribution:
Willing to contribute, if I can get necessary guidance.

Examples or references:
None

Additional context:
None

@nicksnyder
Copy link
Member

Just as a note to folks who come across this issue, updating protovalidate-go is blocked on the spec itself being updated (bufbuild/protovalidate#362), and then we will want to land a similar change to all other supported protovalidate implementations at the same time.

@KeXiangWang
Copy link
Author

Hi @nicksnyder I'm interested in your repo and planning to implement bitwise operations in this repo. @smaye81
told me you would welcome the PR. bufbuild/protovalidate#362 (comment) However, before kicking off, I still want to confirm one thing: would you consider merging my PR to your main branch? This will break your consistency between different languages.

@nicksnyder
Copy link
Member

I'm sorry there was some confusion caused by that comment. We can't merge features into this repo (or any Protovalidate repo) until:

  1. The CEL spec itself supports those features, and
  2. We have PRs ready to add support to all protovalidate implementations

We need to maintain consistency across all Protovalidate implementations.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Feature New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants