templateval

package module
v0.1.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 31, 2025 License: MIT Imports: 5 Imported by: 1

README

templateval - Go Template Validation Library

Go Go Report Card

templateval is a comprehensive Go library for validating template variables with strong typing support. It provides flexible validation for all Go types including basic types, structs, interfaces, functions, slices, maps, and more.

Features

  • Type-safe validation for all Go types
  • Custom validators for complex validation logic
  • Required/Optional field specification
  • Partial validation for incomplete data sets
  • Template registry for reusable validation rules
  • Concurrent-safe implementation
  • Detailed error reporting with field-specific messages
  • Comprehensive type compatibility checks

Installation

go get github.com/abiiranathan/templateval

Quick Start

package main

import (
	"fmt"
	"github.com/abiiranathan/templateval"
)

func main() {
	// Create a new validator
	validator := templateval.NewValidator().
		RequiredString("name", func(v any) error {
			if s, ok := v.(string); ok && len(s) < 3 {
				return fmt.Errorf("must be at least 3 characters")
			}
			return nil
		}).
		RequiredInt("age", func(v any) error {
			if i, ok := v.(int); ok && i < 18 {
				return fmt.Errorf("must be at least 18")
			}
			return nil
		}).
		OptionalString("email")

	// Validate data
	err := validator.Validate(map[string]any{
		"name": "John Doe",
		"age":  25,
	})

	if err != nil {
		fmt.Println("Validation failed:", err)
	} else {
		fmt.Println("Validation passed!")
	}
}

Core Concepts

Validator

The Validator is the main component that holds validation rules. You can:

  • Add rules for different types of fields
  • Validate complete or partial data sets
  • Manage rules dynamically
Validation Rules

Each rule specifies:

  • Field name
  • Expected type
  • Required/Optional status
  • Optional custom validation function
Registry

The Registry allows storing and reusing validators under named templates.

API Documentation

Validator Methods
Basic Type Validators
  • RequiredString(name string, validators ...func(any) error) *Validator
  • OptionalString(name string, validators ...func(any) error) *Validator
  • RequiredInt(name string, validators ...func(any) error) *Validator
  • OptionalInt(name string, validators ...func(any) error) *Validator
  • Similar methods for other basic types: Bool, Float, etc.
Complex Type Validators
  • RequiredOf(name string, sample any) *Validator
  • OptionalOf(name string, sample any) *Validator
  • RequiredSlice(name string, elemType reflect.Type) *Validator
  • RequiredMap(name string, keyType, valueType reflect.Type) *Validator
  • RequiredStruct(name string, typ reflect.Type) *Validator
  • RequiredInterface(name string, typ reflect.Type) *Validator
  • RequiredFunc(name string, typ reflect.Type) *Validator
  • RequiredPointer(name string, typ reflect.Type) *Validator
  • RequiredChan(name string, typ reflect.Type) *Validator
  • Optional variants for all above
Validation
  • Validate(variables map[string]any) error - Full validation
  • ValidatePartial(variables map[string]any) error - Partial validation
Rule Management
  • HasRule(name string) bool
  • GetRule(name string) (Rule, bool)
  • RemoveRule(name string)
  • ListFields() []string
  • Clone() *Validator
Registry Methods
  • Register(name string, validator *Validator)
  • Unregister(name string)
  • HasTemplate(name string) bool
  • GetValidator(name string) (*Validator, bool)
  • ListTemplates() []string
  • Clear()
  • Validate(name string, variables map[string]any) error
  • ValidatePartial(name string, variables map[string]any) error

Advanced Usage

Custom Validators
validator := NewValidator().
	RequiredString("username", func(v any) error {
		username := v.(string)
		if len(username) < 5 {
			return fmt.Errorf("must be at least 5 characters")
		}
		if !strings.Contains(username, "_") {
			return fmt.Errorf("must contain an underscore")
		}
		return nil
	})
Interface Validation
type Stringer interface {
	String() string
}

validator := NewValidator().
	RequiredInterface("stringer", reflect.TypeOf((*Stringer)(nil)).Elem())

err := validator.Validate(map[string]any{
	"stringer": myStringerImpl,
})
Function Validation
type Processor func(string) int

validator := NewValidator().
	RequiredFunc("processor", reflect.TypeOf(Processor(nil)))

err := validator.Validate(map[string]any{
	"processor": func(s string) int { return len(s) },
})
Template Registry
registry := NewRegistry()

// Register a user template
userValidator := NewValidator().
	RequiredString("name").
	RequiredInt("age")
registry.Register("user", userValidator)

// Validate using the template
err := registry.Validate("user", map[string]any{
	"name": "Alice",
	"age": 30,
})

Error Handling

Validation errors provide detailed information:

err := validator.Validate(data)
if err != nil {
	if verr, ok := err.(ValidationErrors); ok {
		for _, e := range verr {
			fmt.Printf("Field %s: %s\n", e.Field, e.Message)
		}
	}
}

Performance Considerations

  • The library uses reflection but caches type information
  • Validators are safe for concurrent use
  • Consider reusing validators via the Registry

Contributing

Contributions are welcome! Please open issues or pull requests on GitHub.

License

MIT License

Documentation

Overview

templateval is a comprehensive Go library for validating template variables with strong typing support.

It provides flexible validation for all Go types including basic types, structs, interfaces, functions, slices, maps, and more.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func InterfaceType

func InterfaceType[T any](sample T) reflect.Type

Helper function to create interface type

func TypeOf

func TypeOf[T any](sample T) reflect.Type

Helper function to get type from sample value

Types

type FieldRule

type FieldRule struct {
	Type      reflect.Type    // Type of the field.
	Required  bool            // Whether this field is required or not
	Validator func(any) error // Optional custom validator function
}

FieldRule defines validation rules for a template variable

type TemplateRegistry

type TemplateRegistry struct {
	// contains filtered or unexported fields
}

TemplateRegistry manages validators for multiple templates

func NewRegistry

func NewRegistry() *TemplateRegistry

NewRegistry creates a new template registry

func (*TemplateRegistry) Clear

func (r *TemplateRegistry) Clear()

Clear removes all registered validators

func (*TemplateRegistry) GetValidator

func (r *TemplateRegistry) GetValidator(name string) (*TemplateValidator, bool)

GetValidator returns the validator for a template

func (*TemplateRegistry) HasTemplate

func (r *TemplateRegistry) HasTemplate(name string) bool

HasTemplate checks if a template is registered

func (*TemplateRegistry) ListTemplates

func (r *TemplateRegistry) ListTemplates() []string

ListTemplates returns all registered template names

func (*TemplateRegistry) Register

func (r *TemplateRegistry) Register(name string, validator *TemplateValidator)

Register adds a validator for a template. If template is an empty string, it will panic. if validator is nil, no registration will happen.

func (*TemplateRegistry) Unregister

func (r *TemplateRegistry) Unregister(name string)

Unregister removes a validator for a template

func (*TemplateRegistry) Validate

func (r *TemplateRegistry) Validate(name string, variables map[string]any) error

Validate validates variables for a specific template

func (*TemplateRegistry) ValidatePartial

func (r *TemplateRegistry) ValidatePartial(name string, variables map[string]any) error

ValidatePartial validates variables partially for a specific template

type TemplateValidator

type TemplateValidator struct {
	// contains filtered or unexported fields
}

TemplateValidator validates template variables against defined rules

func NewValidator

func NewValidator() *TemplateValidator

NewValidator creates a new template validator

func (*TemplateValidator) AddRule

func (v *TemplateValidator) AddRule(fieldName string, fieldType reflect.Type, required bool, customValidator ...func(any) error) *TemplateValidator

AddRule adds a validation rule for a field with optional custom validator

func (*TemplateValidator) Clone

Clone creates a deep copy of the validator

func (*TemplateValidator) GetRule

func (v *TemplateValidator) GetRule(fieldName string) (FieldRule, bool)

GetRule returns the rule for a field

func (*TemplateValidator) HasRule

func (v *TemplateValidator) HasRule(fieldName string) bool

HasRule checks if a rule exists for the given field

func (*TemplateValidator) ListFields

func (v *TemplateValidator) ListFields() []string

ListFields returns all field names that have rules

func (*TemplateValidator) Optional

func (v *TemplateValidator) Optional(fieldName string, fieldType reflect.Type, customValidator ...func(any) error) *TemplateValidator

Optional adds an optional field rule for any type

func (*TemplateValidator) OptionalBool

func (v *TemplateValidator) OptionalBool(fieldName string, customValidator ...func(any) error) *TemplateValidator

func (*TemplateValidator) OptionalChan

func (v *TemplateValidator) OptionalChan(fieldName string, elementType reflect.Type, customValidator ...func(any) error) *TemplateValidator

func (*TemplateValidator) OptionalFunc

func (v *TemplateValidator) OptionalFunc(fieldName string, funcType reflect.Type, customValidator ...func(any) error) *TemplateValidator

func (*TemplateValidator) OptionalInt

func (v *TemplateValidator) OptionalInt(fieldName string, customValidator ...func(any) error) *TemplateValidator

func (*TemplateValidator) OptionalInterface

func (v *TemplateValidator) OptionalInterface(fieldName string, interfaceType reflect.Type, customValidator ...func(any) error) *TemplateValidator

func (*TemplateValidator) OptionalMap

func (v *TemplateValidator) OptionalMap(fieldName string, keyType, valueType reflect.Type, customValidator ...func(any) error) *TemplateValidator

func (*TemplateValidator) OptionalOf

func (v *TemplateValidator) OptionalOf(fieldName string, sample any, customValidator ...func(any) error) *TemplateValidator

OptionalOf adds an optional field rule using a sample value to infer type

func (*TemplateValidator) OptionalPointer

func (v *TemplateValidator) OptionalPointer(fieldName string, elementType reflect.Type, customValidator ...func(any) error) *TemplateValidator

func (*TemplateValidator) OptionalSlice

func (v *TemplateValidator) OptionalSlice(fieldName string, elementType reflect.Type, customValidator ...func(any) error) *TemplateValidator

func (*TemplateValidator) OptionalString

func (v *TemplateValidator) OptionalString(fieldName string, customValidator ...func(any) error) *TemplateValidator

func (*TemplateValidator) OptionalStruct

func (v *TemplateValidator) OptionalStruct(fieldName string, structType reflect.Type, customValidator ...func(any) error) *TemplateValidator

func (*TemplateValidator) RemoveRule

func (v *TemplateValidator) RemoveRule(fieldName string) *TemplateValidator

RemoveRule removes a validation rule for a field

func (*TemplateValidator) Required

func (v *TemplateValidator) Required(fieldName string, fieldType reflect.Type, customValidator ...func(any) error) *TemplateValidator

Required adds a required field rule for any type

func (*TemplateValidator) RequiredBool

func (v *TemplateValidator) RequiredBool(fieldName string, customValidator ...func(any) error) *TemplateValidator

func (*TemplateValidator) RequiredChan

func (v *TemplateValidator) RequiredChan(fieldName string, elementType reflect.Type, customValidator ...func(any) error) *TemplateValidator

func (*TemplateValidator) RequiredFunc

func (v *TemplateValidator) RequiredFunc(fieldName string, funcType reflect.Type, customValidator ...func(any) error) *TemplateValidator

func (*TemplateValidator) RequiredInt

func (v *TemplateValidator) RequiredInt(fieldName string, customValidator ...func(any) error) *TemplateValidator

func (*TemplateValidator) RequiredInterface

func (v *TemplateValidator) RequiredInterface(fieldName string, interfaceType reflect.Type, customValidator ...func(any) error) *TemplateValidator

Type-specific methods with validation

func (*TemplateValidator) RequiredMap

func (v *TemplateValidator) RequiredMap(fieldName string, keyType, valueType reflect.Type, customValidator ...func(any) error) *TemplateValidator

func (*TemplateValidator) RequiredOf

func (v *TemplateValidator) RequiredOf(fieldName string, sample any, customValidator ...func(any) error) *TemplateValidator

RequiredOf adds a required field rule using a sample value to infer type

func (*TemplateValidator) RequiredPointer

func (v *TemplateValidator) RequiredPointer(fieldName string, elementType reflect.Type, customValidator ...func(any) error) *TemplateValidator

func (*TemplateValidator) RequiredSlice

func (v *TemplateValidator) RequiredSlice(fieldName string, elementType reflect.Type, customValidator ...func(any) error) *TemplateValidator

func (*TemplateValidator) RequiredString

func (v *TemplateValidator) RequiredString(fieldName string, customValidator ...func(any) error) *TemplateValidator

Convenience methods for common types

func (*TemplateValidator) RequiredStruct

func (v *TemplateValidator) RequiredStruct(fieldName string, structType reflect.Type, customValidator ...func(any) error) *TemplateValidator

func (*TemplateValidator) Validate

func (v *TemplateValidator) Validate(variables map[string]any) error

Validate checks the provided variables against the defined rules

func (*TemplateValidator) ValidatePartial

func (v *TemplateValidator) ValidatePartial(variables map[string]any) error

ValidatePartial validates only the provided variables, ignoring missing required fields Useful for partial updates or progressive validation

type ValidationError

type ValidationError struct {
	Field   string // Field name failing the calidation
	Message string // Error message
}

ValidationError represents a validation failure

func (ValidationError) Error

func (e ValidationError) Error() string

Implements the error interface.

type ValidationErrors

type ValidationErrors []ValidationError

ValidationErrors is a collection of validation errors

func (ValidationErrors) Error

func (ve ValidationErrors) Error() string

Implements the error interface.

func (ValidationErrors) GetFieldErrors

func (ve ValidationErrors) GetFieldErrors(field string) []ValidationError

GetFieldErrors returns all errors for a specific field

func (ValidationErrors) HasField

func (ve ValidationErrors) HasField(field string) bool

HasField checks if a specific field has validation errors

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL