---
name: validate_struct_fields
kind: function
lang: go
domain: core
version: "1.0.0"
purity: pure
signature: "func ValidateStructFields(data map[string]any, rules map[string]string) (bool, []string)"
description: "Valida campos de un map[string]any contra reglas declarativas tipo 'required,min=1,max=100,type=string'. Soporta required, type, min/max, minlen/maxlen, oneof, pattern. Pensado para validar metadata de entities en operations.db o resultados de queries sin definir structs Go. Acumula todos los errores."
tags: [validation, map, rules, pure, core, operations, pendiente-usar]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: [fmt, regexp, strconv, strings]
params:
  - name: data
    desc: "map[string]any con los campos a validar"
  - name: rules
    desc: "map[string]string donde cada clave es un campo y el valor es una lista de reglas (required, type, min/max, minlen/maxlen, oneof, pattern)"
output: "tupla (válido: bool, errores: []string); si válido es true, errores está vacío"
tested: true
tests:
  - "campo required presente y ausente"
  - "type validation string como int falla"
  - "numeric ranges"
  - "string lengths"
  - "oneof validation"
  - "pattern matching"
  - "multiples reglas combinadas"
  - "map vacio con reglas required"
test_file_path: "functions/core/validate_struct_fields_test.go"
file_path: "functions/core/validate_struct_fields.go"
---

## Ejemplo

```go
data := map[string]any{
    "name":   "Alice",
    "age":    30,
    "status": "active",
    "email":  "alice@example.com",
}

rules := map[string]string{
    "name":   "required,type=string,minlen=2,maxlen=100",
    "age":    "required,type=int,min=0,max=150",
    "status": "required,oneof=active|inactive|pending",
    "email":  `required,type=string,pattern=^[^@]+@[^@]+$`,
}

valid, errs := ValidateStructFields(data, rules)
// valid = true, errs = []

data2 := map[string]any{"name": "A", "age": 200, "status": "deleted"}
valid2, errs2 := ValidateStructFields(data2, rules)
// valid2 = false
// errs2 = [
//   "name: length 1 < minlen 2",
//   "age: 200 > max 150",
//   "status: value \"deleted\" not in oneof [active|inactive|pending]",
//   "email: required field missing",
// ]
```

## Notas

Funcion pura. Solo usa stdlib (fmt, regexp, strconv, strings). Las reglas se evaluan en orden y se acumulan todos los errores. Si `required` falla, se omiten las reglas restantes de ese campo para evitar falsos positivos. Tipos Go aceptados para type=int: int, int8..int64, uint..uint64. Tipo float acepta enteros tambien. Pattern compila el regex en cada llamada — para uso intensivo cachear los regexp compilados fuera.
