mirror of
https://github.com/ceph/ceph-csi.git
synced 2024-12-30 00:40:21 +00:00
662 lines
29 KiB
Go
662 lines
29 KiB
Go
|
// Copyright 2018 Google LLC
|
||
|
//
|
||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
// you may not use this file except in compliance with the License.
|
||
|
// You may obtain a copy of the License at
|
||
|
//
|
||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||
|
//
|
||
|
// Unless required by applicable law or agreed to in writing, software
|
||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
// See the License for the specific language governing permissions and
|
||
|
// limitations under the License.
|
||
|
|
||
|
// Package stdlib contains all of the standard library function declarations and definitions for CEL.
|
||
|
package stdlib
|
||
|
|
||
|
import (
|
||
|
"github.com/google/cel-go/common/decls"
|
||
|
"github.com/google/cel-go/common/functions"
|
||
|
"github.com/google/cel-go/common/operators"
|
||
|
"github.com/google/cel-go/common/overloads"
|
||
|
"github.com/google/cel-go/common/types"
|
||
|
"github.com/google/cel-go/common/types/ref"
|
||
|
"github.com/google/cel-go/common/types/traits"
|
||
|
|
||
|
exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
stdFunctions []*decls.FunctionDecl
|
||
|
stdFnDecls []*exprpb.Decl
|
||
|
stdTypes []*decls.VariableDecl
|
||
|
stdTypeDecls []*exprpb.Decl
|
||
|
)
|
||
|
|
||
|
func init() {
|
||
|
paramA := types.NewTypeParamType("A")
|
||
|
paramB := types.NewTypeParamType("B")
|
||
|
listOfA := types.NewListType(paramA)
|
||
|
mapOfAB := types.NewMapType(paramA, paramB)
|
||
|
|
||
|
stdTypes = []*decls.VariableDecl{
|
||
|
decls.TypeVariable(types.BoolType),
|
||
|
decls.TypeVariable(types.BytesType),
|
||
|
decls.TypeVariable(types.DoubleType),
|
||
|
decls.TypeVariable(types.DurationType),
|
||
|
decls.TypeVariable(types.IntType),
|
||
|
decls.TypeVariable(listOfA),
|
||
|
decls.TypeVariable(mapOfAB),
|
||
|
decls.TypeVariable(types.NullType),
|
||
|
decls.TypeVariable(types.StringType),
|
||
|
decls.TypeVariable(types.TimestampType),
|
||
|
decls.TypeVariable(types.TypeType),
|
||
|
decls.TypeVariable(types.UintType),
|
||
|
}
|
||
|
|
||
|
stdTypeDecls = make([]*exprpb.Decl, 0, len(stdTypes))
|
||
|
for _, stdType := range stdTypes {
|
||
|
typeVar, err := decls.VariableDeclToExprDecl(stdType)
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
stdTypeDecls = append(stdTypeDecls, typeVar)
|
||
|
}
|
||
|
|
||
|
stdFunctions = []*decls.FunctionDecl{
|
||
|
// Logical operators. Special-cased within the interpreter.
|
||
|
// Note, the singleton binding prevents extensions from overriding the operator behavior.
|
||
|
function(operators.Conditional,
|
||
|
decls.Overload(overloads.Conditional, argTypes(types.BoolType, paramA, paramA), paramA,
|
||
|
decls.OverloadIsNonStrict()),
|
||
|
decls.SingletonFunctionBinding(noFunctionOverrides)),
|
||
|
function(operators.LogicalAnd,
|
||
|
decls.Overload(overloads.LogicalAnd, argTypes(types.BoolType, types.BoolType), types.BoolType,
|
||
|
decls.OverloadIsNonStrict()),
|
||
|
decls.SingletonBinaryBinding(noBinaryOverrides)),
|
||
|
function(operators.LogicalOr,
|
||
|
decls.Overload(overloads.LogicalOr, argTypes(types.BoolType, types.BoolType), types.BoolType,
|
||
|
decls.OverloadIsNonStrict()),
|
||
|
decls.SingletonBinaryBinding(noBinaryOverrides)),
|
||
|
function(operators.LogicalNot,
|
||
|
decls.Overload(overloads.LogicalNot, argTypes(types.BoolType), types.BoolType),
|
||
|
decls.SingletonUnaryBinding(func(val ref.Val) ref.Val {
|
||
|
b, ok := val.(types.Bool)
|
||
|
if !ok {
|
||
|
return types.MaybeNoSuchOverloadErr(val)
|
||
|
}
|
||
|
return b.Negate()
|
||
|
})),
|
||
|
|
||
|
// Comprehension short-circuiting related function
|
||
|
function(operators.NotStrictlyFalse,
|
||
|
decls.Overload(overloads.NotStrictlyFalse, argTypes(types.BoolType), types.BoolType,
|
||
|
decls.OverloadIsNonStrict(),
|
||
|
decls.UnaryBinding(notStrictlyFalse))),
|
||
|
// Deprecated: __not_strictly_false__
|
||
|
function(operators.OldNotStrictlyFalse,
|
||
|
decls.DisableDeclaration(true), // safe deprecation
|
||
|
decls.Overload(operators.OldNotStrictlyFalse, argTypes(types.BoolType), types.BoolType,
|
||
|
decls.OverloadIsNonStrict(),
|
||
|
decls.UnaryBinding(notStrictlyFalse))),
|
||
|
|
||
|
// Equality / inequality. Special-cased in the interpreter
|
||
|
function(operators.Equals,
|
||
|
decls.Overload(overloads.Equals, argTypes(paramA, paramA), types.BoolType),
|
||
|
decls.SingletonBinaryBinding(noBinaryOverrides)),
|
||
|
function(operators.NotEquals,
|
||
|
decls.Overload(overloads.NotEquals, argTypes(paramA, paramA), types.BoolType),
|
||
|
decls.SingletonBinaryBinding(noBinaryOverrides)),
|
||
|
|
||
|
// Mathematical operators
|
||
|
function(operators.Add,
|
||
|
decls.Overload(overloads.AddBytes,
|
||
|
argTypes(types.BytesType, types.BytesType), types.BytesType),
|
||
|
decls.Overload(overloads.AddDouble,
|
||
|
argTypes(types.DoubleType, types.DoubleType), types.DoubleType),
|
||
|
decls.Overload(overloads.AddDurationDuration,
|
||
|
argTypes(types.DurationType, types.DurationType), types.DurationType),
|
||
|
decls.Overload(overloads.AddDurationTimestamp,
|
||
|
argTypes(types.DurationType, types.TimestampType), types.TimestampType),
|
||
|
decls.Overload(overloads.AddTimestampDuration,
|
||
|
argTypes(types.TimestampType, types.DurationType), types.TimestampType),
|
||
|
decls.Overload(overloads.AddInt64,
|
||
|
argTypes(types.IntType, types.IntType), types.IntType),
|
||
|
decls.Overload(overloads.AddList,
|
||
|
argTypes(listOfA, listOfA), listOfA),
|
||
|
decls.Overload(overloads.AddString,
|
||
|
argTypes(types.StringType, types.StringType), types.StringType),
|
||
|
decls.Overload(overloads.AddUint64,
|
||
|
argTypes(types.UintType, types.UintType), types.UintType),
|
||
|
decls.SingletonBinaryBinding(func(lhs, rhs ref.Val) ref.Val {
|
||
|
return lhs.(traits.Adder).Add(rhs)
|
||
|
}, traits.AdderType)),
|
||
|
function(operators.Divide,
|
||
|
decls.Overload(overloads.DivideDouble,
|
||
|
argTypes(types.DoubleType, types.DoubleType), types.DoubleType),
|
||
|
decls.Overload(overloads.DivideInt64,
|
||
|
argTypes(types.IntType, types.IntType), types.IntType),
|
||
|
decls.Overload(overloads.DivideUint64,
|
||
|
argTypes(types.UintType, types.UintType), types.UintType),
|
||
|
decls.SingletonBinaryBinding(func(lhs, rhs ref.Val) ref.Val {
|
||
|
return lhs.(traits.Divider).Divide(rhs)
|
||
|
}, traits.DividerType)),
|
||
|
function(operators.Modulo,
|
||
|
decls.Overload(overloads.ModuloInt64,
|
||
|
argTypes(types.IntType, types.IntType), types.IntType),
|
||
|
decls.Overload(overloads.ModuloUint64,
|
||
|
argTypes(types.UintType, types.UintType), types.UintType),
|
||
|
decls.SingletonBinaryBinding(func(lhs, rhs ref.Val) ref.Val {
|
||
|
return lhs.(traits.Modder).Modulo(rhs)
|
||
|
}, traits.ModderType)),
|
||
|
function(operators.Multiply,
|
||
|
decls.Overload(overloads.MultiplyDouble,
|
||
|
argTypes(types.DoubleType, types.DoubleType), types.DoubleType),
|
||
|
decls.Overload(overloads.MultiplyInt64,
|
||
|
argTypes(types.IntType, types.IntType), types.IntType),
|
||
|
decls.Overload(overloads.MultiplyUint64,
|
||
|
argTypes(types.UintType, types.UintType), types.UintType),
|
||
|
decls.SingletonBinaryBinding(func(lhs, rhs ref.Val) ref.Val {
|
||
|
return lhs.(traits.Multiplier).Multiply(rhs)
|
||
|
}, traits.MultiplierType)),
|
||
|
function(operators.Negate,
|
||
|
decls.Overload(overloads.NegateDouble, argTypes(types.DoubleType), types.DoubleType),
|
||
|
decls.Overload(overloads.NegateInt64, argTypes(types.IntType), types.IntType),
|
||
|
decls.SingletonUnaryBinding(func(val ref.Val) ref.Val {
|
||
|
if types.IsBool(val) {
|
||
|
return types.MaybeNoSuchOverloadErr(val)
|
||
|
}
|
||
|
return val.(traits.Negater).Negate()
|
||
|
}, traits.NegatorType)),
|
||
|
function(operators.Subtract,
|
||
|
decls.Overload(overloads.SubtractDouble,
|
||
|
argTypes(types.DoubleType, types.DoubleType), types.DoubleType),
|
||
|
decls.Overload(overloads.SubtractDurationDuration,
|
||
|
argTypes(types.DurationType, types.DurationType), types.DurationType),
|
||
|
decls.Overload(overloads.SubtractInt64,
|
||
|
argTypes(types.IntType, types.IntType), types.IntType),
|
||
|
decls.Overload(overloads.SubtractTimestampDuration,
|
||
|
argTypes(types.TimestampType, types.DurationType), types.TimestampType),
|
||
|
decls.Overload(overloads.SubtractTimestampTimestamp,
|
||
|
argTypes(types.TimestampType, types.TimestampType), types.DurationType),
|
||
|
decls.Overload(overloads.SubtractUint64,
|
||
|
argTypes(types.UintType, types.UintType), types.UintType),
|
||
|
decls.SingletonBinaryBinding(func(lhs, rhs ref.Val) ref.Val {
|
||
|
return lhs.(traits.Subtractor).Subtract(rhs)
|
||
|
}, traits.SubtractorType)),
|
||
|
|
||
|
// Relations operators
|
||
|
|
||
|
function(operators.Less,
|
||
|
decls.Overload(overloads.LessBool,
|
||
|
argTypes(types.BoolType, types.BoolType), types.BoolType),
|
||
|
decls.Overload(overloads.LessInt64,
|
||
|
argTypes(types.IntType, types.IntType), types.BoolType),
|
||
|
decls.Overload(overloads.LessInt64Double,
|
||
|
argTypes(types.IntType, types.DoubleType), types.BoolType),
|
||
|
decls.Overload(overloads.LessInt64Uint64,
|
||
|
argTypes(types.IntType, types.UintType), types.BoolType),
|
||
|
decls.Overload(overloads.LessUint64,
|
||
|
argTypes(types.UintType, types.UintType), types.BoolType),
|
||
|
decls.Overload(overloads.LessUint64Double,
|
||
|
argTypes(types.UintType, types.DoubleType), types.BoolType),
|
||
|
decls.Overload(overloads.LessUint64Int64,
|
||
|
argTypes(types.UintType, types.IntType), types.BoolType),
|
||
|
decls.Overload(overloads.LessDouble,
|
||
|
argTypes(types.DoubleType, types.DoubleType), types.BoolType),
|
||
|
decls.Overload(overloads.LessDoubleInt64,
|
||
|
argTypes(types.DoubleType, types.IntType), types.BoolType),
|
||
|
decls.Overload(overloads.LessDoubleUint64,
|
||
|
argTypes(types.DoubleType, types.UintType), types.BoolType),
|
||
|
decls.Overload(overloads.LessString,
|
||
|
argTypes(types.StringType, types.StringType), types.BoolType),
|
||
|
decls.Overload(overloads.LessBytes,
|
||
|
argTypes(types.BytesType, types.BytesType), types.BoolType),
|
||
|
decls.Overload(overloads.LessTimestamp,
|
||
|
argTypes(types.TimestampType, types.TimestampType), types.BoolType),
|
||
|
decls.Overload(overloads.LessDuration,
|
||
|
argTypes(types.DurationType, types.DurationType), types.BoolType),
|
||
|
decls.SingletonBinaryBinding(func(lhs, rhs ref.Val) ref.Val {
|
||
|
cmp := lhs.(traits.Comparer).Compare(rhs)
|
||
|
if cmp == types.IntNegOne {
|
||
|
return types.True
|
||
|
}
|
||
|
if cmp == types.IntOne || cmp == types.IntZero {
|
||
|
return types.False
|
||
|
}
|
||
|
return cmp
|
||
|
}, traits.ComparerType)),
|
||
|
|
||
|
function(operators.LessEquals,
|
||
|
decls.Overload(overloads.LessEqualsBool,
|
||
|
argTypes(types.BoolType, types.BoolType), types.BoolType),
|
||
|
decls.Overload(overloads.LessEqualsInt64,
|
||
|
argTypes(types.IntType, types.IntType), types.BoolType),
|
||
|
decls.Overload(overloads.LessEqualsInt64Double,
|
||
|
argTypes(types.IntType, types.DoubleType), types.BoolType),
|
||
|
decls.Overload(overloads.LessEqualsInt64Uint64,
|
||
|
argTypes(types.IntType, types.UintType), types.BoolType),
|
||
|
decls.Overload(overloads.LessEqualsUint64,
|
||
|
argTypes(types.UintType, types.UintType), types.BoolType),
|
||
|
decls.Overload(overloads.LessEqualsUint64Double,
|
||
|
argTypes(types.UintType, types.DoubleType), types.BoolType),
|
||
|
decls.Overload(overloads.LessEqualsUint64Int64,
|
||
|
argTypes(types.UintType, types.IntType), types.BoolType),
|
||
|
decls.Overload(overloads.LessEqualsDouble,
|
||
|
argTypes(types.DoubleType, types.DoubleType), types.BoolType),
|
||
|
decls.Overload(overloads.LessEqualsDoubleInt64,
|
||
|
argTypes(types.DoubleType, types.IntType), types.BoolType),
|
||
|
decls.Overload(overloads.LessEqualsDoubleUint64,
|
||
|
argTypes(types.DoubleType, types.UintType), types.BoolType),
|
||
|
decls.Overload(overloads.LessEqualsString,
|
||
|
argTypes(types.StringType, types.StringType), types.BoolType),
|
||
|
decls.Overload(overloads.LessEqualsBytes,
|
||
|
argTypes(types.BytesType, types.BytesType), types.BoolType),
|
||
|
decls.Overload(overloads.LessEqualsTimestamp,
|
||
|
argTypes(types.TimestampType, types.TimestampType), types.BoolType),
|
||
|
decls.Overload(overloads.LessEqualsDuration,
|
||
|
argTypes(types.DurationType, types.DurationType), types.BoolType),
|
||
|
decls.SingletonBinaryBinding(func(lhs, rhs ref.Val) ref.Val {
|
||
|
cmp := lhs.(traits.Comparer).Compare(rhs)
|
||
|
if cmp == types.IntNegOne || cmp == types.IntZero {
|
||
|
return types.True
|
||
|
}
|
||
|
if cmp == types.IntOne {
|
||
|
return types.False
|
||
|
}
|
||
|
return cmp
|
||
|
}, traits.ComparerType)),
|
||
|
|
||
|
function(operators.Greater,
|
||
|
decls.Overload(overloads.GreaterBool,
|
||
|
argTypes(types.BoolType, types.BoolType), types.BoolType),
|
||
|
decls.Overload(overloads.GreaterInt64,
|
||
|
argTypes(types.IntType, types.IntType), types.BoolType),
|
||
|
decls.Overload(overloads.GreaterInt64Double,
|
||
|
argTypes(types.IntType, types.DoubleType), types.BoolType),
|
||
|
decls.Overload(overloads.GreaterInt64Uint64,
|
||
|
argTypes(types.IntType, types.UintType), types.BoolType),
|
||
|
decls.Overload(overloads.GreaterUint64,
|
||
|
argTypes(types.UintType, types.UintType), types.BoolType),
|
||
|
decls.Overload(overloads.GreaterUint64Double,
|
||
|
argTypes(types.UintType, types.DoubleType), types.BoolType),
|
||
|
decls.Overload(overloads.GreaterUint64Int64,
|
||
|
argTypes(types.UintType, types.IntType), types.BoolType),
|
||
|
decls.Overload(overloads.GreaterDouble,
|
||
|
argTypes(types.DoubleType, types.DoubleType), types.BoolType),
|
||
|
decls.Overload(overloads.GreaterDoubleInt64,
|
||
|
argTypes(types.DoubleType, types.IntType), types.BoolType),
|
||
|
decls.Overload(overloads.GreaterDoubleUint64,
|
||
|
argTypes(types.DoubleType, types.UintType), types.BoolType),
|
||
|
decls.Overload(overloads.GreaterString,
|
||
|
argTypes(types.StringType, types.StringType), types.BoolType),
|
||
|
decls.Overload(overloads.GreaterBytes,
|
||
|
argTypes(types.BytesType, types.BytesType), types.BoolType),
|
||
|
decls.Overload(overloads.GreaterTimestamp,
|
||
|
argTypes(types.TimestampType, types.TimestampType), types.BoolType),
|
||
|
decls.Overload(overloads.GreaterDuration,
|
||
|
argTypes(types.DurationType, types.DurationType), types.BoolType),
|
||
|
decls.SingletonBinaryBinding(func(lhs, rhs ref.Val) ref.Val {
|
||
|
cmp := lhs.(traits.Comparer).Compare(rhs)
|
||
|
if cmp == types.IntOne {
|
||
|
return types.True
|
||
|
}
|
||
|
if cmp == types.IntNegOne || cmp == types.IntZero {
|
||
|
return types.False
|
||
|
}
|
||
|
return cmp
|
||
|
}, traits.ComparerType)),
|
||
|
|
||
|
function(operators.GreaterEquals,
|
||
|
decls.Overload(overloads.GreaterEqualsBool,
|
||
|
argTypes(types.BoolType, types.BoolType), types.BoolType),
|
||
|
decls.Overload(overloads.GreaterEqualsInt64,
|
||
|
argTypes(types.IntType, types.IntType), types.BoolType),
|
||
|
decls.Overload(overloads.GreaterEqualsInt64Double,
|
||
|
argTypes(types.IntType, types.DoubleType), types.BoolType),
|
||
|
decls.Overload(overloads.GreaterEqualsInt64Uint64,
|
||
|
argTypes(types.IntType, types.UintType), types.BoolType),
|
||
|
decls.Overload(overloads.GreaterEqualsUint64,
|
||
|
argTypes(types.UintType, types.UintType), types.BoolType),
|
||
|
decls.Overload(overloads.GreaterEqualsUint64Double,
|
||
|
argTypes(types.UintType, types.DoubleType), types.BoolType),
|
||
|
decls.Overload(overloads.GreaterEqualsUint64Int64,
|
||
|
argTypes(types.UintType, types.IntType), types.BoolType),
|
||
|
decls.Overload(overloads.GreaterEqualsDouble,
|
||
|
argTypes(types.DoubleType, types.DoubleType), types.BoolType),
|
||
|
decls.Overload(overloads.GreaterEqualsDoubleInt64,
|
||
|
argTypes(types.DoubleType, types.IntType), types.BoolType),
|
||
|
decls.Overload(overloads.GreaterEqualsDoubleUint64,
|
||
|
argTypes(types.DoubleType, types.UintType), types.BoolType),
|
||
|
decls.Overload(overloads.GreaterEqualsString,
|
||
|
argTypes(types.StringType, types.StringType), types.BoolType),
|
||
|
decls.Overload(overloads.GreaterEqualsBytes,
|
||
|
argTypes(types.BytesType, types.BytesType), types.BoolType),
|
||
|
decls.Overload(overloads.GreaterEqualsTimestamp,
|
||
|
argTypes(types.TimestampType, types.TimestampType), types.BoolType),
|
||
|
decls.Overload(overloads.GreaterEqualsDuration,
|
||
|
argTypes(types.DurationType, types.DurationType), types.BoolType),
|
||
|
decls.SingletonBinaryBinding(func(lhs, rhs ref.Val) ref.Val {
|
||
|
cmp := lhs.(traits.Comparer).Compare(rhs)
|
||
|
if cmp == types.IntOne || cmp == types.IntZero {
|
||
|
return types.True
|
||
|
}
|
||
|
if cmp == types.IntNegOne {
|
||
|
return types.False
|
||
|
}
|
||
|
return cmp
|
||
|
}, traits.ComparerType)),
|
||
|
|
||
|
// Indexing
|
||
|
function(operators.Index,
|
||
|
decls.Overload(overloads.IndexList, argTypes(listOfA, types.IntType), paramA),
|
||
|
decls.Overload(overloads.IndexMap, argTypes(mapOfAB, paramA), paramB),
|
||
|
decls.SingletonBinaryBinding(func(lhs, rhs ref.Val) ref.Val {
|
||
|
return lhs.(traits.Indexer).Get(rhs)
|
||
|
}, traits.IndexerType)),
|
||
|
|
||
|
// Collections operators
|
||
|
function(operators.In,
|
||
|
decls.Overload(overloads.InList, argTypes(paramA, listOfA), types.BoolType),
|
||
|
decls.Overload(overloads.InMap, argTypes(paramA, mapOfAB), types.BoolType),
|
||
|
decls.SingletonBinaryBinding(inAggregate)),
|
||
|
function(operators.OldIn,
|
||
|
decls.DisableDeclaration(true), // safe deprecation
|
||
|
decls.Overload(overloads.InList, argTypes(paramA, listOfA), types.BoolType),
|
||
|
decls.Overload(overloads.InMap, argTypes(paramA, mapOfAB), types.BoolType),
|
||
|
decls.SingletonBinaryBinding(inAggregate)),
|
||
|
function(overloads.DeprecatedIn,
|
||
|
decls.DisableDeclaration(true), // safe deprecation
|
||
|
decls.Overload(overloads.InList, argTypes(paramA, listOfA), types.BoolType),
|
||
|
decls.Overload(overloads.InMap, argTypes(paramA, mapOfAB), types.BoolType),
|
||
|
decls.SingletonBinaryBinding(inAggregate)),
|
||
|
function(overloads.Size,
|
||
|
decls.Overload(overloads.SizeBytes, argTypes(types.BytesType), types.IntType),
|
||
|
decls.MemberOverload(overloads.SizeBytesInst, argTypes(types.BytesType), types.IntType),
|
||
|
decls.Overload(overloads.SizeList, argTypes(listOfA), types.IntType),
|
||
|
decls.MemberOverload(overloads.SizeListInst, argTypes(listOfA), types.IntType),
|
||
|
decls.Overload(overloads.SizeMap, argTypes(mapOfAB), types.IntType),
|
||
|
decls.MemberOverload(overloads.SizeMapInst, argTypes(mapOfAB), types.IntType),
|
||
|
decls.Overload(overloads.SizeString, argTypes(types.StringType), types.IntType),
|
||
|
decls.MemberOverload(overloads.SizeStringInst, argTypes(types.StringType), types.IntType),
|
||
|
decls.SingletonUnaryBinding(func(val ref.Val) ref.Val {
|
||
|
return val.(traits.Sizer).Size()
|
||
|
}, traits.SizerType)),
|
||
|
|
||
|
// Type conversions
|
||
|
function(overloads.TypeConvertType,
|
||
|
decls.Overload(overloads.TypeConvertType, argTypes(paramA), types.NewTypeTypeWithParam(paramA)),
|
||
|
decls.SingletonUnaryBinding(convertToType(types.TypeType))),
|
||
|
|
||
|
// Bool conversions
|
||
|
function(overloads.TypeConvertBool,
|
||
|
decls.Overload(overloads.BoolToBool, argTypes(types.BoolType), types.BoolType,
|
||
|
decls.UnaryBinding(identity)),
|
||
|
decls.Overload(overloads.StringToBool, argTypes(types.StringType), types.BoolType,
|
||
|
decls.UnaryBinding(convertToType(types.BoolType)))),
|
||
|
|
||
|
// Bytes conversions
|
||
|
function(overloads.TypeConvertBytes,
|
||
|
decls.Overload(overloads.BytesToBytes, argTypes(types.BytesType), types.BytesType,
|
||
|
decls.UnaryBinding(identity)),
|
||
|
decls.Overload(overloads.StringToBytes, argTypes(types.StringType), types.BytesType,
|
||
|
decls.UnaryBinding(convertToType(types.BytesType)))),
|
||
|
|
||
|
// Double conversions
|
||
|
function(overloads.TypeConvertDouble,
|
||
|
decls.Overload(overloads.DoubleToDouble, argTypes(types.DoubleType), types.DoubleType,
|
||
|
decls.UnaryBinding(identity)),
|
||
|
decls.Overload(overloads.IntToDouble, argTypes(types.IntType), types.DoubleType,
|
||
|
decls.UnaryBinding(convertToType(types.DoubleType))),
|
||
|
decls.Overload(overloads.StringToDouble, argTypes(types.StringType), types.DoubleType,
|
||
|
decls.UnaryBinding(convertToType(types.DoubleType))),
|
||
|
decls.Overload(overloads.UintToDouble, argTypes(types.UintType), types.DoubleType,
|
||
|
decls.UnaryBinding(convertToType(types.DoubleType)))),
|
||
|
|
||
|
// Duration conversions
|
||
|
function(overloads.TypeConvertDuration,
|
||
|
decls.Overload(overloads.DurationToDuration, argTypes(types.DurationType), types.DurationType,
|
||
|
decls.UnaryBinding(identity)),
|
||
|
decls.Overload(overloads.IntToDuration, argTypes(types.IntType), types.DurationType,
|
||
|
decls.UnaryBinding(convertToType(types.DurationType))),
|
||
|
decls.Overload(overloads.StringToDuration, argTypes(types.StringType), types.DurationType,
|
||
|
decls.UnaryBinding(convertToType(types.DurationType)))),
|
||
|
|
||
|
// Dyn conversions
|
||
|
function(overloads.TypeConvertDyn,
|
||
|
decls.Overload(overloads.ToDyn, argTypes(paramA), types.DynType),
|
||
|
decls.SingletonUnaryBinding(identity)),
|
||
|
|
||
|
// Int conversions
|
||
|
function(overloads.TypeConvertInt,
|
||
|
decls.Overload(overloads.IntToInt, argTypes(types.IntType), types.IntType,
|
||
|
decls.UnaryBinding(identity)),
|
||
|
decls.Overload(overloads.DoubleToInt, argTypes(types.DoubleType), types.IntType,
|
||
|
decls.UnaryBinding(convertToType(types.IntType))),
|
||
|
decls.Overload(overloads.DurationToInt, argTypes(types.DurationType), types.IntType,
|
||
|
decls.UnaryBinding(convertToType(types.IntType))),
|
||
|
decls.Overload(overloads.StringToInt, argTypes(types.StringType), types.IntType,
|
||
|
decls.UnaryBinding(convertToType(types.IntType))),
|
||
|
decls.Overload(overloads.TimestampToInt, argTypes(types.TimestampType), types.IntType,
|
||
|
decls.UnaryBinding(convertToType(types.IntType))),
|
||
|
decls.Overload(overloads.UintToInt, argTypes(types.UintType), types.IntType,
|
||
|
decls.UnaryBinding(convertToType(types.IntType))),
|
||
|
),
|
||
|
|
||
|
// String conversions
|
||
|
function(overloads.TypeConvertString,
|
||
|
decls.Overload(overloads.StringToString, argTypes(types.StringType), types.StringType,
|
||
|
decls.UnaryBinding(identity)),
|
||
|
decls.Overload(overloads.BoolToString, argTypes(types.BoolType), types.StringType,
|
||
|
decls.UnaryBinding(convertToType(types.StringType))),
|
||
|
decls.Overload(overloads.BytesToString, argTypes(types.BytesType), types.StringType,
|
||
|
decls.UnaryBinding(convertToType(types.StringType))),
|
||
|
decls.Overload(overloads.DoubleToString, argTypes(types.DoubleType), types.StringType,
|
||
|
decls.UnaryBinding(convertToType(types.StringType))),
|
||
|
decls.Overload(overloads.DurationToString, argTypes(types.DurationType), types.StringType,
|
||
|
decls.UnaryBinding(convertToType(types.StringType))),
|
||
|
decls.Overload(overloads.IntToString, argTypes(types.IntType), types.StringType,
|
||
|
decls.UnaryBinding(convertToType(types.StringType))),
|
||
|
decls.Overload(overloads.TimestampToString, argTypes(types.TimestampType), types.StringType,
|
||
|
decls.UnaryBinding(convertToType(types.StringType))),
|
||
|
decls.Overload(overloads.UintToString, argTypes(types.UintType), types.StringType,
|
||
|
decls.UnaryBinding(convertToType(types.StringType)))),
|
||
|
|
||
|
// Timestamp conversions
|
||
|
function(overloads.TypeConvertTimestamp,
|
||
|
decls.Overload(overloads.TimestampToTimestamp, argTypes(types.TimestampType), types.TimestampType,
|
||
|
decls.UnaryBinding(identity)),
|
||
|
decls.Overload(overloads.IntToTimestamp, argTypes(types.IntType), types.TimestampType,
|
||
|
decls.UnaryBinding(convertToType(types.TimestampType))),
|
||
|
decls.Overload(overloads.StringToTimestamp, argTypes(types.StringType), types.TimestampType,
|
||
|
decls.UnaryBinding(convertToType(types.TimestampType)))),
|
||
|
|
||
|
// Uint conversions
|
||
|
function(overloads.TypeConvertUint,
|
||
|
decls.Overload(overloads.UintToUint, argTypes(types.UintType), types.UintType,
|
||
|
decls.UnaryBinding(identity)),
|
||
|
decls.Overload(overloads.DoubleToUint, argTypes(types.DoubleType), types.UintType,
|
||
|
decls.UnaryBinding(convertToType(types.UintType))),
|
||
|
decls.Overload(overloads.IntToUint, argTypes(types.IntType), types.UintType,
|
||
|
decls.UnaryBinding(convertToType(types.UintType))),
|
||
|
decls.Overload(overloads.StringToUint, argTypes(types.StringType), types.UintType,
|
||
|
decls.UnaryBinding(convertToType(types.UintType)))),
|
||
|
|
||
|
// String functions
|
||
|
function(overloads.Contains,
|
||
|
decls.MemberOverload(overloads.ContainsString,
|
||
|
argTypes(types.StringType, types.StringType), types.BoolType,
|
||
|
decls.BinaryBinding(types.StringContains)),
|
||
|
decls.DisableTypeGuards(true)),
|
||
|
function(overloads.EndsWith,
|
||
|
decls.MemberOverload(overloads.EndsWithString,
|
||
|
argTypes(types.StringType, types.StringType), types.BoolType,
|
||
|
decls.BinaryBinding(types.StringEndsWith)),
|
||
|
decls.DisableTypeGuards(true)),
|
||
|
function(overloads.StartsWith,
|
||
|
decls.MemberOverload(overloads.StartsWithString,
|
||
|
argTypes(types.StringType, types.StringType), types.BoolType,
|
||
|
decls.BinaryBinding(types.StringStartsWith)),
|
||
|
decls.DisableTypeGuards(true)),
|
||
|
function(overloads.Matches,
|
||
|
decls.Overload(overloads.Matches, argTypes(types.StringType, types.StringType), types.BoolType),
|
||
|
decls.MemberOverload(overloads.MatchesString,
|
||
|
argTypes(types.StringType, types.StringType), types.BoolType),
|
||
|
decls.SingletonBinaryBinding(func(str, pat ref.Val) ref.Val {
|
||
|
return str.(traits.Matcher).Match(pat)
|
||
|
}, traits.MatcherType)),
|
||
|
|
||
|
// Timestamp / duration functions
|
||
|
function(overloads.TimeGetFullYear,
|
||
|
decls.MemberOverload(overloads.TimestampToYear,
|
||
|
argTypes(types.TimestampType), types.IntType),
|
||
|
decls.MemberOverload(overloads.TimestampToYearWithTz,
|
||
|
argTypes(types.TimestampType, types.StringType), types.IntType)),
|
||
|
|
||
|
function(overloads.TimeGetMonth,
|
||
|
decls.MemberOverload(overloads.TimestampToMonth,
|
||
|
argTypes(types.TimestampType), types.IntType),
|
||
|
decls.MemberOverload(overloads.TimestampToMonthWithTz,
|
||
|
argTypes(types.TimestampType, types.StringType), types.IntType)),
|
||
|
|
||
|
function(overloads.TimeGetDayOfYear,
|
||
|
decls.MemberOverload(overloads.TimestampToDayOfYear,
|
||
|
argTypes(types.TimestampType), types.IntType),
|
||
|
decls.MemberOverload(overloads.TimestampToDayOfYearWithTz,
|
||
|
argTypes(types.TimestampType, types.StringType), types.IntType)),
|
||
|
|
||
|
function(overloads.TimeGetDayOfMonth,
|
||
|
decls.MemberOverload(overloads.TimestampToDayOfMonthZeroBased,
|
||
|
argTypes(types.TimestampType), types.IntType),
|
||
|
decls.MemberOverload(overloads.TimestampToDayOfMonthZeroBasedWithTz,
|
||
|
argTypes(types.TimestampType, types.StringType), types.IntType)),
|
||
|
|
||
|
function(overloads.TimeGetDate,
|
||
|
decls.MemberOverload(overloads.TimestampToDayOfMonthOneBased,
|
||
|
argTypes(types.TimestampType), types.IntType),
|
||
|
decls.MemberOverload(overloads.TimestampToDayOfMonthOneBasedWithTz,
|
||
|
argTypes(types.TimestampType, types.StringType), types.IntType)),
|
||
|
|
||
|
function(overloads.TimeGetDayOfWeek,
|
||
|
decls.MemberOverload(overloads.TimestampToDayOfWeek,
|
||
|
argTypes(types.TimestampType), types.IntType),
|
||
|
decls.MemberOverload(overloads.TimestampToDayOfWeekWithTz,
|
||
|
argTypes(types.TimestampType, types.StringType), types.IntType)),
|
||
|
|
||
|
function(overloads.TimeGetHours,
|
||
|
decls.MemberOverload(overloads.TimestampToHours,
|
||
|
argTypes(types.TimestampType), types.IntType),
|
||
|
decls.MemberOverload(overloads.TimestampToHoursWithTz,
|
||
|
argTypes(types.TimestampType, types.StringType), types.IntType),
|
||
|
decls.MemberOverload(overloads.DurationToHours,
|
||
|
argTypes(types.DurationType), types.IntType)),
|
||
|
|
||
|
function(overloads.TimeGetMinutes,
|
||
|
decls.MemberOverload(overloads.TimestampToMinutes,
|
||
|
argTypes(types.TimestampType), types.IntType),
|
||
|
decls.MemberOverload(overloads.TimestampToMinutesWithTz,
|
||
|
argTypes(types.TimestampType, types.StringType), types.IntType),
|
||
|
decls.MemberOverload(overloads.DurationToMinutes,
|
||
|
argTypes(types.DurationType), types.IntType)),
|
||
|
|
||
|
function(overloads.TimeGetSeconds,
|
||
|
decls.MemberOverload(overloads.TimestampToSeconds,
|
||
|
argTypes(types.TimestampType), types.IntType),
|
||
|
decls.MemberOverload(overloads.TimestampToSecondsWithTz,
|
||
|
argTypes(types.TimestampType, types.StringType), types.IntType),
|
||
|
decls.MemberOverload(overloads.DurationToSeconds,
|
||
|
argTypes(types.DurationType), types.IntType)),
|
||
|
|
||
|
function(overloads.TimeGetMilliseconds,
|
||
|
decls.MemberOverload(overloads.TimestampToMilliseconds,
|
||
|
argTypes(types.TimestampType), types.IntType),
|
||
|
decls.MemberOverload(overloads.TimestampToMillisecondsWithTz,
|
||
|
argTypes(types.TimestampType, types.StringType), types.IntType),
|
||
|
decls.MemberOverload(overloads.DurationToMilliseconds,
|
||
|
argTypes(types.DurationType), types.IntType)),
|
||
|
}
|
||
|
|
||
|
stdFnDecls = make([]*exprpb.Decl, 0, len(stdFunctions))
|
||
|
for _, fn := range stdFunctions {
|
||
|
if fn.IsDeclarationDisabled() {
|
||
|
continue
|
||
|
}
|
||
|
ed, err := decls.FunctionDeclToExprDecl(fn)
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
stdFnDecls = append(stdFnDecls, ed)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Functions returns the set of standard library function declarations and definitions for CEL.
|
||
|
func Functions() []*decls.FunctionDecl {
|
||
|
return stdFunctions
|
||
|
}
|
||
|
|
||
|
// FunctionExprDecls returns the legacy style protobuf-typed declarations for all functions and overloads
|
||
|
// in the CEL standard environment.
|
||
|
//
|
||
|
// Deprecated: use Functions
|
||
|
func FunctionExprDecls() []*exprpb.Decl {
|
||
|
return stdFnDecls
|
||
|
}
|
||
|
|
||
|
// Types returns the set of standard library types for CEL.
|
||
|
func Types() []*decls.VariableDecl {
|
||
|
return stdTypes
|
||
|
}
|
||
|
|
||
|
// TypeExprDecls returns the legacy style protobuf-typed declarations for all types in the CEL
|
||
|
// standard environment.
|
||
|
//
|
||
|
// Deprecated: use Types
|
||
|
func TypeExprDecls() []*exprpb.Decl {
|
||
|
return stdTypeDecls
|
||
|
}
|
||
|
|
||
|
func notStrictlyFalse(value ref.Val) ref.Val {
|
||
|
if types.IsBool(value) {
|
||
|
return value
|
||
|
}
|
||
|
return types.True
|
||
|
}
|
||
|
|
||
|
func inAggregate(lhs ref.Val, rhs ref.Val) ref.Val {
|
||
|
if rhs.Type().HasTrait(traits.ContainerType) {
|
||
|
return rhs.(traits.Container).Contains(lhs)
|
||
|
}
|
||
|
return types.ValOrErr(rhs, "no such overload")
|
||
|
}
|
||
|
|
||
|
func function(name string, opts ...decls.FunctionOpt) *decls.FunctionDecl {
|
||
|
fn, err := decls.NewFunction(name, opts...)
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
return fn
|
||
|
}
|
||
|
|
||
|
func argTypes(args ...*types.Type) []*types.Type {
|
||
|
return args
|
||
|
}
|
||
|
|
||
|
func noBinaryOverrides(rhs, lhs ref.Val) ref.Val {
|
||
|
return types.NoSuchOverloadErr()
|
||
|
}
|
||
|
|
||
|
func noFunctionOverrides(args ...ref.Val) ref.Val {
|
||
|
return types.NoSuchOverloadErr()
|
||
|
}
|
||
|
|
||
|
func identity(val ref.Val) ref.Val {
|
||
|
return val
|
||
|
}
|
||
|
|
||
|
func convertToType(t ref.Type) functions.UnaryOp {
|
||
|
return func(val ref.Val) ref.Val {
|
||
|
return val.ConvertToType(t)
|
||
|
}
|
||
|
}
|