Common Expression Language (CEL)

Sobre

CEL (Common Expression Language) é uma linguagem de expressão rápida, portátil e segura, projetada para ser embutida em aplicações e estender configurações declarativas (filtros, validações, regras de autorização). Mantida como projeto open source, com especificação em cel-expr/cel-spec.

Fonte: https://cel.dev/

Características principais

CaracterísticaDescrição
RápidaAvaliação de nanossegundos a microssegundos, com custo previsível
PortátilSintaxe leve e comum entre sistemas Google e externos
SeguraNão é Turing-completa; acessa apenas dados fornecidos pela aplicação host
Formalmente verificávelProvas de corretude e equivalência via solvers SMT (Z3)
ExtensívelAceita funções e tipos específicos da aplicação

Exemplos de sintaxe

// Predicados simples
'tacocat'.startsWith('taco')
 
// Predicados parametrizados sobre dados estruturados
account.balance >= transaction.withdrawal
 
// Objetos JSON
{'sub': '12345678',
 'aud': 'example2.cel.dev',
 'iss': 'https://example1.cel.dev/jwt-issuer'}
 
// Objetos fortemente tipados
common.GeoPoint{ latitude: 10.0, longitude: -5.5 }

Casos de uso

  • Filtros de lista em chamadas de API
  • Constraints de validação em protocol buffers
  • Regras de autorização em requisições de API
  • Kubernetes: validação e políticas direto na API do cluster, sem webhooks externos (doc)
  • Google Cloud: filtro e transformação de eventos (Eventarc)

Quando usar

Ideal quando a expressão é avaliada com frequência e alterada raramente: o custo de validar a expressão é pago uma vez e a avaliação posterior é desprezível. Exemplo típico: avaliar uma requisição HTTP contra uma política de segurança. Bom para lógica de predicados e transformações simples de dados.

Verificação formal (novidade)

O CEL Formal Verification Framework, baseado no Z3, permite:

  • Provar a corretude de políticas em todo o espaço de entrada
  • Checar equivalência de AST entre duas expressões
  • Garantir invariantes de segurança

Motivação: políticas escritas ou refatoradas por agentes de IA podem ter casos de borda não cobertos por testes unitários. Implementação de referência: CEL Java Verifier.

Limitações

  • Não é Turing-completa (sem loops arbitrários), por design
  • Voltada a expressões, não a programas completos
  • Nota gerada a partir da página inicial; detalhes de funções e tipos estão na definição da linguagem

Referências