---
name: parse_cron_expr
kind: function
lang: go
domain: core
version: "1.0.0"
purity: pure
signature: "func ParseCronExpr(expr string) (CronSchedule, error)"
description: "Parsea una expresion cron estandar de 5 campos en un CronSchedule con valores expandidos. Soporta *, rangos (1-5), listas (1,3,5), pasos (*/15) y aliases (@hourly, @daily, @weekly, @monthly, @yearly). No soporta segundos ni years estilo Quartz."
tags: [cron, scheduling, parsing, time, pure]
uses_functions: []
uses_types: [cron_schedule_go_core]
returns: []
returns_optional: false
error_type: ""
imports: [fmt, strconv, strings]
params:
  - name: expr
    desc: "expresión cron de 5 campos: minuto hora día_mes mes día_semana; soporta *, rangos, listas, pasos y aliases"
output: "CronSchedule con listas de valores válidos por campo; error si la expresión es inválida"
tested: true
tests:
  - "*/15 expande minutos a [0 15 30 45]"
  - "@daily resuelve a 0 0 en todos los campos restantes"
  - "0 9 1,15 * * expande dias a [1 15]"
  - "0 9 * * 1-5 expande dia de semana a [1 2 3 4 5]"
  - "expresion con 4 campos retorna error"
  - "minuto fuera de rango retorna error"
test_file_path: "functions/core/parse_cron_expr_test.go"
file_path: "functions/core/parse_cron_expr.go"
---

## Ejemplo

```go
sched, err := ParseCronExpr("*/15 * * * *")
// sched.Minute = [0, 15, 30, 45]
// sched.Hour   = [0, 1, ..., 23]

sched2, _ := ParseCronExpr("@daily")
// sched2.Minute = [0], sched2.Hour = [0]

sched3, _ := ParseCronExpr("0 9 * * 1-5")
// sched3.DayOfWeek = [1, 2, 3, 4, 5]  (lunes a viernes)
```

## Notas

Funcion pura. Cada campo cron se expande a la lista completa de valores enteros validos. Los aliases se resuelven antes del parseo. Los limites son: minute [0,59], hour [0,23], day_of_month [1,31], month [1,12], day_of_week [0,6] (0=domingo).
