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.
Protobuf fields are converted to CEL types. For example, a Protobuf int32
or int64
field becomes a CEL int
. See the section on Protocol Buffer Data Conversion in the CEL language reference. When comparing this
against literal values, make sure to use the appropriate literal, for example 1u
for an unsigned integer, and 1.0
for a double
. If needed, you can convert types with CEL's conversion functions, for example uint(1)
.
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. You cannot access your extension field on rules
, but it's available in the rule
variable. 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.