or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

code-generation.mdcore-plugin.mdgenerated-code.mdindex.mdruntime-libraries.mdvalidation-rules.md
tile.json

tessl/go-protoc-gen-validate

Protoc plugin to generate polyglot message validators for protocol buffers

Workspace
tessl
Visibility
Public
Created
Last updated
Describes

pkg:github/bufbuild/protoc-gen-validate@1.2.x

To install, run

npx @tessl/cli install tessl/go-protoc-gen-validate@1.2.0

index.mddocs/

protoc-gen-validate

protoc-gen-validate (PGV) is a protoc plugin that generates polyglot message validators for protocol buffer messages. It enables semantic validation rules for protocol buffer fields that cannot be expressed through basic type constraints alone, supporting Go, Java, C++, and Python with generated validation methods.

Package Information

  • Package Name: protoc-gen-validate
  • Package Type: Go tool/protoc plugin
  • Language: Go
  • Installation: Download from GitHub Releases or build from source

Core Imports

For validation rules in proto files:

import "validate/validate.proto";

For Python runtime validation:

from protoc_gen_validate.validator import validate, ValidationFailed

Basic Usage

Define validation rules in proto files:

syntax = "proto3";
package example;
import "validate/validate.proto";

message User {
  uint64 id = 1 [(validate.rules).uint64.gt = 999];
  string email = 2 [(validate.rules).string.email = true];
  string name = 3 [(validate.rules).string = {
    pattern: "^[A-Za-z]+( [A-Za-z]+)*$",
    max_bytes: 256,
  }];
}

Generate validation code:

protoc \
  -I . \
  -I path/to/validate/ \
  --go_out="./generated" \
  --validate_out="lang=go:./generated" \
  user.proto

Use generated validators:

user := &User{
  Id:    1000,
  Email: "user@example.com", 
  Name:  "John Doe",
}

if err := user.Validate(); err != nil {
  // Handle validation error
}

Architecture

PGV uses a plugin architecture built on the protoc-gen-star framework:

  • Core Plugin: Main protoc plugin entry point that processes proto files
  • Module System: Extensible module for different target languages
  • Template Engine: Language-specific code generation templates
  • Validation Schema: Comprehensive protocol buffer extension definitions
  • Runtime Libraries: Language-specific validation utilities

Capabilities

Core Plugin System

Provides the main protoc plugin functionality for code generation.

// Main entry point for protoc plugin
func main()

// Core module interface
type Module struct {
  *pgs.ModuleBase
  ctx pgsgo.Context
  lang string
}

func Validator() pgs.Module
func ValidatorForLanguage(lang string) pgs.Module

Core Plugin System

Validation Rules Schema

Defines comprehensive validation rules for all protocol buffer field types.

// Main field rules container
message FieldRules {
  optional MessageRules message = 17;
  oneof type {
    FloatRules    float    = 1;
    DoubleRules   double   = 2;
    Int32Rules    int32    = 3;
    // ... all numeric types
    StringRules   string   = 14;
    BytesRules    bytes    = 15;
    EnumRules     enum     = 16;
    RepeatedRules repeated = 18;
    MapRules      map      = 19;
    AnyRules      any      = 20;
    DurationRules duration = 21;
    TimestampRules timestamp = 22;
  }
}

// Protocol buffer extensions
extend google.protobuf.FieldOptions {
  optional FieldRules rules = 1071;
}

Validation Rules Schema

Code Generation Templates

Template system for generating validation code in multiple languages.

type RegisterFn func(tpl *template.Template, params pgs.Parameters)
type FilePathFn func(f pgs.File, ctx pgsgo.Context, tpl *template.Template) *pgs.FilePath

func Template(params pgs.Parameters) map[string][]*template.Template
func FilePathFor(tpl *template.Template) FilePathFn

Code Generation Templates

Generated Code API

APIs provided by generated validation code in each target language.

// Go generated methods
func (m *Message) Validate() error
func (m *Message) ValidateAll() error
// Java validation interface
class ReflectiveValidatorIndex {
  Validator validatorFor(Class<?> clazz)
}
# Python runtime validation
def validate(msg) -> None  # raises ValidationFailed
def print_validate(msg) -> None

Generated Code API

Runtime Libraries

Language-specific runtime libraries and utilities for validation.

class ValidationFailed(Exception):
  """Raised when message validation fails"""
  pass

Runtime Libraries

Supported Languages

  • Go: Full support with Validate() and ValidateAll() methods
  • Java: Full support with ReflectiveValidatorIndex and gRPC interceptors
  • C++: Header and implementation file generation
  • Python: JIT runtime validation with caching

Types

// Module represents the core PGV module
type Module struct {
  *pgs.ModuleBase
  ctx pgsgo.Context
  lang string
}

// Template registration function
type RegisterFn func(tpl *template.Template, params pgs.Parameters)

// File path generation function  
type FilePathFn func(f pgs.File, ctx pgsgo.Context, tpl *template.Template) *pgs.FilePath
// Core validation rule types
message FieldRules { /* see validation rules schema */ }
message StringRules { /* string validation rules */ }
message MessageRules { /* message validation rules */ }
message RepeatedRules { /* repeated field validation rules */ }
message MapRules { /* map field validation rules */ }
class ValidationFailed(Exception):
  """Exception raised when validation fails"""
  pass