-
Notifications
You must be signed in to change notification settings - Fork 0
DSL Tasks
El sistema de tasks permite definir bloques reutilizables de lógica dentro del DSL YAML y ejecutarlos desde cualquier parte del flow.
Una task es, conceptualmente:
- Un nombre
- Un conjunto opcional de parámetros de entrada (
params) - Un conjunto opcional de valores de retorno (
returns) - Un
flow(lista de nodos) que se ejecuta cuando la task es invocada
Para invocar una task se usa el nodo task dentro de flow.nodes, y para devolver resultados se usa el nodo return.
Ver también:
-
Flow (nodos) (nodos
taskyreturn) -
DSL Reference (sección
event.tasks) -
Comandos (catálogo:
/cee tasks export)
CEE soporta dos orígenes de tasks:
Se definen dentro del YAML del evento. Solo están disponibles para ese evento.
event:
id: "mi_evento"
tasks:
add:
params:
a: number
b: number
returns:
sum: number
flow:
nodes:
- return:
sum: "= a + b"CEE carga tasks globales desde archivos .yml en la carpeta del plugin:
- Ruta:
plugins/CustomEventEngine/tasks/ - Estructura del archivo: una sección raíz
tasks:con entradas por nombre.
Ejemplo plugins/CustomEventEngine/tasks/math.yml:
tasks:
add:
params:
a: number
b: number
returns:
sum: number
flow:
nodes:
- return:
sum: "= a + b"Disponibilidad:
- Las tasks globales están disponibles para todos los eventos.
- Si un evento define una task con el mismo nombre que una global, la del evento tiene prioridad para ese evento.
Texto libre para describir la intención de la task.
Mapa paramName -> definición.
Formas soportadas:
- Forma corta (solo tipo):
params:
playerName: string
amount: number- Forma completa:
params:
amount:
type: number
required: true
default: 1Campos:
-
type:string | number | boolean | array | object -
required:true|false(default:true) -
default: valor por defecto si el caller no lo provee (opcional)
Notas:
- Si
required: truey no haydefault, el caller debe proveer el parámetro entask.with. - El valor de
defaultse resuelve en runtime (acepta variables/expresiones, ver Variables).
Mapa returnName -> definición.
Formas soportadas:
- Forma corta (solo tipo):
returns:
sum: number
ok: boolean- Forma completa:
returns:
sum:
type: numberCampos:
-
type:string | number | boolean | array | object
El cuerpo de la task es un flow estándar.
Se puede declarar como:
flow:
nodes: [ ... ]o, como atajo:
nodes: [ ... ]Dentro del flow se pueden usar acciones, bucles, async, llamadas a otras tasks y return.
El nodo task se declara dentro de flow.nodes.
- task: "add"- task:
name: "add"
with:
a: 2
b: 3
into:
sum: "result"
max_depth: 64Campos:
-
name: nombre de la task (string). -
with: mapa de argumentosparamName -> value.- Los valores se resuelven en runtime, admitiendo:
- Literales
-
{var}/${var} - Expresiones MVEL con prefijo
=
- Los valores se resuelven en runtime, admitiendo:
-
into: mapareturnName -> variableDestino.- Si se declara, los retornos se escriben en variables cuando la task finaliza.
-
max_depth: límite de profundidad de llamadas anidadas (default:64).- Protege contra recursión infinita o composición excesiva.
-
override: definición inline de una task para esta llamada (ver sección “Override”).
return finaliza la ejecución de la task actual y devuelve valores al caller.
- return:
sum: "= a + b"
ok: trueComportamiento:
- Los valores del
returnse resuelven en runtime (variables/expresiones). - Se aplica el mapeo
task.into(si existe): cadareturnNamese copia a suvariableDestino. - Si la task termina sin ejecutar
return, se considera retorno vacío (no escribe nada eninto).
override permite redefinir una task solo para un punto de llamada.
Esto es útil para variar comportamiento sin tocar la task global/base, o para especializar una task dentro de un flujo puntual.
Ejemplo:
- task:
name: "base"
with: { x: 1 }
into: { out: "value" }
override:
description: "Versión local de base"
params: { x: number }
returns: { out: number }
nodes:
- return:
out: "= x + 5"Notas:
- El
overridepuede incluirparams,returns,flow/nodes. - Durante la validación de carga, el override se valida como una task (nombres, params y retornos).
Una task puede llamar a otras tasks (y así componer lógica compleja).
Ejemplo:
event:
tasks:
add:
params: { a: number, b: number }
returns: { sum: number }
nodes:
- return: { sum: "= a + b" }
add3:
params: { x: number }
returns: { sum: number }
nodes:
- task:
name: "add"
with: { a: "= x", b: 3 }
into: { sum: "tmp" }
- return:
sum: "= tmp"Control de recursión:
- En cada llamada se evalúa
max_depth. - Si se excede, el runtime se cancela con error.
Cuando una task se invoca:
- Sus parámetros (
params) se inyectan como variables en el contexto antes de ejecutar su flow. - Al finalizar (por
returno fin del flow), el runtime restaura el estado previo de esas variables.
Efecto práctico:
- Los parámetros actúan como un “scope” local de la task, evitando dejar basura en variables del evento.
- El mapeo
intoes el mecanismo recomendado para “sacar” resultados de una task.
CEE valida en el parseo/carga:
- Llamadas a tasks inexistentes.
- Parámetros desconocidos en
with. - Faltantes de parámetros requeridos (sin
default). - Retornos desconocidos en
into. - Variables destino vacías en
into. -
max_depthinválido (< 1).
Si hay errores, el evento (o la task global) no se carga y se registran los motivos en consola.
Puedes exportar un catálogo de tasks (globales y por evento) a disco:
- Comando:
/cee tasks export - Archivo generado:
plugins/CustomEventEngine/task-catalog.yml
Ver: Comandos.
CustomEventEngine • Paper/Spigot API 1.20+ • Java 21