Important
The repository github.com/antonmedv/expr moved to github.com/expr-lang/expr.
Expr is a Go-centric expression language designed to deliver dynamic configurations with unparalleled accuracy, safety, and speed. Expr combines simple syntax with powerful features for ease of use:
// Allow only admins and moderators to moderate comments.
user.Group in ["admin", "moderator"] || user.Id == comment.UserId
// Determine whether the request is in the permitted time window.
request.Time - resource.Age < duration("24h")
// Ensure all tweets are less than 240 characters.
all(tweets, len(.Content) <= 240)
Expr is a safe, fast, and intuitive expression evaluator optimized for the Go language. Here are its standout features:
- Memory-Safe: Expr is designed with a focus on safety, ensuring that programs do not access unrelated memory or introduce memory vulnerabilities.
- Side-Effect-Free: Expressions evaluated in Expr only compute outputs from their inputs, ensuring no side-effects that can change state or produce unintended results.
- Always Terminating: Expr is designed to prevent infinite loops, ensuring that every program will conclude in a reasonable amount of time.
- Seamless with Go: Integrate Expr into your Go projects without the need to redefine types.
- Ensures type correctness and prevents runtime type errors.
out, err := expr.Compile(`name + age`) // err: invalid operation + (mismatched types string and int) // | name + age // | .....^
- Provides user-friendly error messages to assist with debugging and development.
- Rich Operators: Offers a reasonable set of basic operators for a variety of applications.
- Built-in Functions: Functions like
all
,none
,any
,one
,filter
, andmap
are provided out-of-the-box.
- Optimized for Speed: Expr stands out in its performance, utilizing an optimizing compiler and a bytecode virtual machine. Check out these benchmarks for more details.
go get github.com/expr-lang/expr
- See Getting Started page for developer documentation.
- See Language Definition page to learn the syntax.
package main
import (
"fmt"
"github.com/expr-lang/expr"
)
func main() {
env := map[string]interface{}{
"greet": "Hello, %v!",
"names": []string{"world", "you"},
"sprintf": fmt.Sprintf,
}
code := `sprintf(greet, names[0])`
program, err := expr.Compile(code, expr.Env(env))
if err != nil {
panic(err)
}
output, err := expr.Run(program, env)
if err != nil {
panic(err)
}
fmt.Println(output)
}
package main
import (
"fmt"
"github.com/expr-lang/expr"
)
type Tweet struct {
Len int
}
type Env struct {
Tweets []Tweet
}
func main() {
code := `all(Tweets, {.Len <= 240})`
program, err := expr.Compile(code, expr.Env(Env{}))
if err != nil {
panic(err)
}
env := Env{
Tweets: []Tweet{{42}, {98}, {69}},
}
output, err := expr.Run(program, env)
if err != nil {
panic(err)
}
fmt.Println(output)
}
- Google uses Expr as one of its expression languages on the Google Cloud Platform.
- Uber uses Expr to allow customization of its Uber Eats marketplace.
- GoDaddy employs Expr for the customization of its GoDaddy Pro product.
- ByteDance incorporates Expr into its internal business rule engine.
- Aviasales utilizes Expr as a business rule engine for its flight search engine.
- Wish.com employs Expr in its decision-making rule engine for the Wish Assistant.
- Argo integrates Expr into Argo Rollouts and Argo Workflows for Kubernetes.
- OpenTelemetry integrates Expr into the OpenTelemetry Collector.
- Philips Labs employs Expr in Tabia, a tool designed to collect insights on their code bases.
- CrowdSec incorporates Expr into its security automation tool.
- CoreDNS uses Expr in CoreDNS, which is a DNS server.
- qiniu implements Expr in its trade systems.
- Junglee Games uses Expr for its in-house marketing retention tool, Project Audience.
- Faceit uses Expr to enhance customization of its eSports matchmaking algorithm.
- Chaos Mesh incorporates Expr into Chaos Mesh, a cloud-native Chaos Engineering platform.
- Visually.io employs Expr as a business rule engine for its personalization targeting algorithm.
- Akvorado utilizes Expr to classify exporters and interfaces in network flows.
- keda.sh uses Expr to allow customization of its Kubernetes-based event-driven autoscaling.