---
name: Role
lang: go
domain: infra
version: "1.0.0"
algebraic: product
definition: |
  type Role struct {
      Name        string       `json:"name"`
      Permissions []Permission `json:"permissions"`
  }
description: "Rol RBAC con nombre y lista de permisos. Los roles son datos puros — cada app decide donde los almacena (hardcoded, JSON, SQLite)."
tags: [rbac, role, auth, infra]
uses_types: [Permission_go_infra]
file_path: "functions/infra/role.go"
---

## Ejemplo

```go
roles := []Role{
    {
        Name: "admin",
        Permissions: []Permission{
            {Resource: "users", Action: "read"},
            {Resource: "users", Action: "write"},
            {Resource: "users", Action: "delete"},
        },
    },
    {
        Name: "viewer",
        Permissions: []Permission{
            {Resource: "users", Action: "read"},
        },
    },
}
```

## Notas

Tipo producto — Name identifica el rol por nombre (coincide con el valor de `claims.Custom["role"]` para RBACMiddleware). Permissions es la lista completa de acciones que el rol puede realizar. No hay herencia entre roles: si admin debe tener todo lo de viewer, hay que incluir esos permisos explicitamente en la definicion de admin. Esta es una decision consciente para mantener la evaluacion lineal y predecible.
