Skip to content

CEL extensions#

This page documents the variables, custom functions, and overloads that Protovalidate adds to Common Expression Language (CEL). All standard rules are defined in CEL expressions and often leverage these Protovalidate-specific CEL extensions.

They are all available in any custom or predefined rule's CEL expression unless otherwise noted.

Variables#

this#

this refers to the current value. When defining a field rule, this refers to the value of the field. When defining a message rule, this refers to the message itself. Its fields can be accessed via dot notation.

now#

now is a google.protobuf.Timestamp. It's computed once per expression: now == now always evaluates to true.

rule#

Only available within predefined rules.

rule refers to the value assigned to a predefined rule when used as a field within a Protobuf message. See complex predefined rules for an example.

rules#

Only available within predefined rules.

Within a predefined rule, rules is an instance of the underlying Protovalidate rule message being extended. For example, the rules variable made available to a CEL expression for a predefined rule extending StringRules is an instance of the StringRules message itself. See complex predefined rules for an example.

Double functions#

Protovalidate adds the following extensions functions to CEL's double type.

isInf#

double.isInf() -> bool

Tests whether the double is an infinity.

isNan#

double.isNan() -> bool

Tests whether the double is NaN. Returns false when isInf() is true.

Int functions#

Protovalidate adds the following extensions functions to CEL's int type.

isInf#

int.isInf() -> bool

Tests whether the int is an infinity.

String functions#

Protovalidate adds the following extensions functions to CEL's string type.

isEmail#

string.isEmail() -> bool

Test whether the string is a valid email address.

isHostAndPort#

string.isHostAndPort(bool) -> bool

Test whether the string is a valid host/port pair. The single bool argument is required, and if it's true, the port is also required—otherwise, the port is optional.

isHostname#

string.isHostname() -> bool

Test whether the string is a valid hostname.

isIp#

string.isIp() -> bool

Test whether the string is a valid IP address in either IPv4 or IPv6.

string.isIp(int) -> bool

Test whether the string is a valid IP address in a specific IP version. Versions other than 0, 4, or 6 always return false.

isIpPrefix#

string.isIpPrefix() -> bool

Test whether the string is a valid IP with prefix length.

string.isIpPrefix(int) -> bool

Test whether the string is a valid IP with prefix length in a specific IP version. Versions other than 0, 4, or 6 always return false.

string.isIpPrefix(bool) -> bool

Test whether the string is a valid IP with prefix length and an appropriate network address.

string.isIpPrefix(int, bool) -> bool

Test whether the string is a valid IP with prefix length in a specific IP version and an appropriate network address. IP versions other than 0, 4, or 6 always return false.

isUri#

string.isUri()

Tests whether the string is a valid absolute URI.

isUriRef#

string.isUriRef() -> bool

Tests whether the string is a valid (absolute or relative) URI.

List functions#

Protovalidate adds the following extensions functions to CEL's list type.

unique#

list.unique()

Test whether the items in the list are all unique. It can be used with lists of the following types:

  • bool
  • bytes
  • double
  • int
  • string
  • uint

Overloads#

Protovalidate overloads the following CEL functions:

contains#

bytes.contains(bytes) -> bool

Overload of the CEL standard contains to support bytes.

endsWith#

bytes.endsWith(bytes) -> bool

Overload of the CEL standard endsWith to support bytes.

startsWith#

bytes.startsWith(bytes) -> bool

Overload of the CEL standard startsWith to support bytes.

Further reading#

Learn about all CEL variables and functions within its language definition.