Saltar al contenido principal

Códigos de error

Todos los diagnósticos que TDC puede emitir, por código. Consúltelo cuando una ejecución se detiene y el mensaje por sí solo no alcanza.

Cómo leer un diagnóstico

Un diagnóstico lleva cuatro cosas, y el código es la parte que no cambia entre versiones: la redacción puede mejorar, TDC193 sigue siendo TDC193.

./run demo.tdc
error[TDC193]: "Naem" is not a declared sequence — it would be printed literally
--> demo.tdc:8:11
|
8 |     <line><data>${{Naem}}</data></line>
|           ^^^^^^^^^^^^^^^^^^^^^^
|
help: did you mean "Name"?
note: Declare it in <env>, or set a different inject= pattern if you really want the text ${{…}} in the output.
  • el código — qué salió mal; estable entre versiones;
  • el lugar — archivo, línea y columna, con el elemento culpable subrayado;
  • help: — una conjetura de lo que quiso decir, cuando el nombre casi acierta;
  • note: — qué hacer al respecto.

La validación corre antes de la generación, así que un config con errores no produce dato alguno en vez de medio archivo. Casi cada diagnóstico aquí es un error y detiene el run: si el config pidió algo que no va a obtener, TDC se niega en vez de devolver datos que parecen correctos pero no lo son. Las excepciones son siete advertencias que dejan terminar el run: TDC136 (una fila de <map> malformada, omitida mientras las válidas siguen aplicando), TDC171 (un archivo de data pack cuya cabecera lo deja sin dirección), TDC200 (una estimación de memoria grande pero que cabe), TDC216 (una expresión que siempre es verdadera o siempre falsa), TDC221 (un grupo <uniq> o <distinct> con un solo miembro, que no restringe nada), TDC231 (un pool que nadie lee) y TDC234 (un pool de más de 100.000 miembros). Cada una lo indica en su fila más abajo.

Los números se reparten más o menos en el orden en que se revisa un config — primero la estructura, luego los generadores, luego todo lo construido encima — pero el número es un identificador, no una clasificación. Guíese por los grupos de abajo.

Estructura del documento

CódigoCuándo saltaQué hacer
TDC001El archivo no tiene raíz <tdc>Envuelva todo en un único <tdc>…</tdc>
TDC002<tdc> no tiene hijo <block>Agregue el <block> con la disposición de un registro
TDC003En <tdc> están version y v a la vezDeje uno — son alias
TDC004La versión declarada no parece una versiónUse una versión que el runtime admita, p. ej. v="0.1" (un valor más nuevo que el runtime lanza TDC005)
TDC005El archivo pide una versión más nueva que este runtimeActualice TDC, o baje la versión declarada
TDC010Bajo <tdc> hay una etiqueta que no es <env> ni <block>Muévala dentro de una de las dos
TDC013Una etiqueta está anidada donde no se permiteVer Etiquetas: qué puede contener qué
TDC014Una etiqueta que necesita hijos se escribió autocerradaEscriba <env …></env>, no <env …/> — sus hijos se perderían en silencio
TDC015Una etiqueta lleva un atributo que el motor no leeLa corrida se detiene: el config pidió algo que no iba a obtener. Revise la escritura — el mensaje sugiere el nombre real más cercano
TDC020count no es un entero no negativocount="1000"
TDC021Un patrón inject no tiene hueco %El marcador necesita % para el nombre, p. ej. inject="[[%]]"

Secuencias

CódigoCuándo saltaQué hacer
TDC030Una etiqueta que necesita nombre no lo tieneAgregue name="…"
TDC031Un nombre de secuencia empieza con _Ese prefijo está reservado a los integrados
TDC032Dos secuencias comparten nombreRenombre una — la referencia sería ambigua
TDC033Un nombre choca con un integradoElija otro; el integrado siempre gana
TDC034Un valor de parent no es Padre.ValorUse las dos partes, p. ej. parent="Gender.Male"
TDC035La secuencia padre se declara después de estaSuba el padre — la resolución va de arriba abajo
TDC214parent= nombra una secuencia compuestaEl padre se filtra por el valor que produjo, y un grupo de campos no produce ninguno
TDC036Un <sequence> no tiene <gen> dentroSin generador una secuencia no produce nada
TDC110retirado — un <gen> sin nombre junto a uno con nombre ahora compone el valor en vez de fallar
TDC111Dos campos de una misma compuesta comparten nombreRenombre uno
TDC129Un <sequence> dentro de una etiqueta de nivel config no da nada útil allíVer Secuencias

Generadores

CódigoCuándo saltaQué hacer
TDC040<gen> no tiene typeAgregue type="…" — ver Generadores
TDC041El tipo es desconocido, o no se admite en un <gen> en líneaRevise la escritura; TDC sugiere el nombre más cercano
TDC050type="text" sin valueDé la lista, p. ej. value="a,b,c"
TDC051Un percent tiene más entradas que la lista valueUn porcentaje por valor
TDC052Una entrada de percent no es un número no negativoLas posiciones llenas son números; una vacía reparte el resto
TDC053Los valores de percent no suman 100Ajústelos a 100, o deje una posición vacía para el resto
TDC060type="file" sin srcApunte src al archivo
TDC061El archivo no se puede leerRevise la ruta — se cuenta desde el config, o use --data-path
TDC062column no se resuelveUn nombre de cabecera (column="email") o un índice desde 1 (column="2")
TDC064row sin columnEl enlace por fila necesita saber de qué columna del CSV tomar
TDC065type="http" sin srcApúntelo al servicio — src="http://127.0.0.1:5566/gen"
TDC066src no es una URL http(s)Use http://… o https://…, con host y ruta
TDC067in= no nombra nada declarado antesEl valor enviado por fila viene de una <sequence> anterior
TDC068on_error no es fail ni emptyfail (por omisión) detiene la corrida; empty deja la celda vacía
TDC070type="template" sin valueDé la dirección con puntos, p. ej. value="person.lastName"
TDC071La dirección de plantilla es desconocidaRevise la escritura, o instale el pack que la provee
TDC072value="date.range" sin range, o un parámetro de type="template" que el pack no declaraAgregue range="…"; o revise el nombre del parámetro — el mensaje lista los válidos
TDC073Un range heredado no son dos fechas válidasUse YYYY.MM.DD - YYYY.MM.DD
TDC081Un rango numérico está mal escritovalue="10..99"
TDC082first_zero no es true ni falseNo hay otros valores
TDC083length no es un número, un rango ni una lista con comasp. ej. length="8", length="6..9", length="4,6,8"
TDC084Un percent sobre un value numérico tiene más entradas de las que el rango admiteUn porcentaje por valor
TDC085Una entrada de percent sobre un número no es un número no negativoLas posiciones llenas son números
TDC086percent sobre un número no suma 100Ajuste los valores a 100
TDC087include/exclude sin rango numérico en valueFiltran un rango, así que el rango debe existir
TDC088distribution se combina con un atributo incompatibleUna distribución con nombre define ella misma el sorteo
TDC089Los parámetros de la distribución están malVer Distribuciones
TDC090Un atributo que debe ser número no lo esRevise el valor
TDC095type="regex" sin valueEl patrón va en value
TDC096regex_max_length no es un entero positivop. ej. regex_max_length="64"
TDC097La expresión regular no parseaCorrija el patrón — sigue el mensaje del propio parser
TDC098A type="symbol" se le dan value y alphabet, o ningunoDé exactamente uno — un conjunto en value o un alphabet con nombre
TDC099El alfabeto con nombre es desconocidoVer Symbol
TDC128type="advanced_regex" sin valueEl patrón va en value
TDC128(segundo significado) default= o if= escritos en un <case>Un <mix> elige su caso por porcentaje y un <switch> por la clave is: ninguno pregunta una condición. Para valores por condición use una <sequence> con ramas <gen if="…">
TDC130El patrón avanzado no parseaVer Advanced regex

Expresiones en if

CódigoCuándo saltaQué hacer
TDC100La expresión no parseaVer Salida y formato
TDC101Un operador binario no está admitidoAdmitidos: == != === !== < > <= >= && || + - * /
TDC102Un operador unario no está admitidoAdmitidos: !, -, +
TDC103Se usa acceso calculado a un miembroSolo se permiten nombres simples
TDC215Un nombre en un if= que ninguna secuencia tieneSe lee como su propio texto: solo, la rama siempre se activa; comparado, nunca
TDC216(advertencia) if="Seq.Value" nombra un valor que la secuencia nunca produceLa rama está muerta. Advertencia y no error: acotar la lista a propósito es algo que se hace
TDC217Una ruta de plantilla existe, pero no para la configuración regional de la corridaEl mensaje nombra la configuración regional; ponga local= en el <gen> o el <env>, o elija una ruta que su configuración regional traiga
TDC218uniq="true" en una secuencia sin valores propios — <compute> lee otras, if= elige una rama por filaPonga uniq= en las secuencias que lee, o envuélvalas en <uniq>
TDC219Un <compute> y un <gen> en la misma <sequence> — uno de los dos se descartaríaMueva el <compute> a su propia <sequence> y lea la sorteada con <field>
TDC220uniq="true" sobre un valor compuesto que junta dos o más partes sorteadasLas partes no tienen ancho fijo, así que un conjunto único de partes no da un string único: 9+15 y 91+5 son los mismos tres caracteres. Deje una sola parte sorteada, o fije los anchos
TDC221(advertencia) Un <uniq> o <distinct> alrededor de menos de dos <sequence>Un grupo restringe a sus miembros entre sí, así que un solo miembro no restringe nada. Agregue un segundo, o escriba uniq="true" en la secuencia misma

<pool>

Ver Registros coherentes.

CódigoCuándo saltaCómo arreglarlo
TDC222Un <pool> sin name, o sin countUn pool se lee por nombre y tiene un número fijo de miembros: <pool name="Doctors" count="30">
TDC223Un <pool count="…"> que no es un entero de al menos 1Un pool vacío no tiene ningún miembro que entregar
TDC224<gen type="pool" value="X"> sin ningún <pool name="X"> declaradoEl mensaje enumera los pools declarados. Declárelo en el mismo <env>
TDC225filter="field == X" donde los dos lados nunca pueden coincidirAmbas listas están escritas en la configuración y no se cruzan, así que cada fila se reduce a ningún miembro. El mensaje nombra las dos. Aquí solo se informa la contradicción segura; un valor que simplemente sale poco se rechaza en la fila que lo saca
TDC226filter= lee Pool.field y el pool no tiene ese campoEl mensaje enumera los campos del pool. Un nombre desconocido sin cualificar se deja pasar: el lenguaje de expresiones lee una palabra suelta como literal
TDC229${{Ref}} donde Ref sortea un miembro enteroUn miembro es un registro, no un valor. Lea un campo: ${{Ref.lastName}}
TDC230Un <block>, una etiqueta de formato u otro <pool> dentro de un <pool>Un pool es una tabla que otras columnas leen, no algo que se escriba en un archivo, y los pools no se anidan
TDC231(advertencia) Un <pool> que ningún <gen type="pool"> leeSe construye entero antes de la primera fila y se mantiene en memoria todo el run, así que uno sin leer se paga y se tira. Léalo o quítelo
TDC232Un nombre en filter= que es a la vez campo del pool y secuenciaRenombre uno de los dos. Cualificar un lado no ayuda: el otro nombre sigue leyéndose como el campo del miembro, así que la comparación sería consigo misma
TDC234(advertencia) Más de 100.000 miembrosUn pool se mantiene en memoria toda la ejecución — unos 320 bytes por miembro con cuatro campos. Si quería decir el número de FILAS, eso es count en <env>
TDC235Más de 1.000.000 de miembrosLa misma causa, pasado el punto en que vale la pena ejecutarlo. Reduzca el pool, o mueva el número a <env count="…">
TDC236(aviso) uniq="true" sobre más de 100 000 filasSacar sin reemplazo obliga a recordar lo ya sacado, así que la columna entera se queda en memoria y la ejecución no puede transmitirse. Medido en unos 250 bytes por valor: 2 000 000 de filas cuestan unos 477 MB. Funciona; conviene hacerlo a conciencia
TDC236Un pool lee un pool declarado más abajo, o a sí mismoLos pools se construyen en orden de declaración, así que un pool solo puede leer los que están por encima. Suba el que lee. Ese mismo orden es la razón por la que un ciclo entre pools no se puede escribir
TDC241Dos pools declarados con el mismo nombreA un pool se llega por su nombre, así que dos no pueden compartirlo. El segundo reemplazaba al primero en silencio, y la única señal era un TDC193 en el bloque sobre un campo que «no existe»
TDC242anomaly o missing no es un número en [0, 1]Ambos son una PROPORCIÓN de los valores: anomaly="0.05", missing="0.1"
TDC243anomaly sobre una lista value sin ningún númeroUna anomalía multiplica un número, así que una lista de palabras vuelve sin cambios
TDC244type="pattern" sin points, src ni upperUn dibujo necesita una forma de la que leer: points="0,0 1,5 2,3", un archivo en src, o upper/lower para una banda

Totales acumulados

Véase accumulate= y <gen type="running">.

CódigoCuándo saltaCómo se arregla
TDC237accumulate= en un generador sin repeat=No hay nada que acumular: no hay lista. Agregue repeat="N" o quite accumulate=. (type="running" es la excepción: acumula por columna)
TDC238accumulate= nombra una operación que no existeUna de sum, min, max
TDC239<gen type="running"> no dice qué (of=) ni cómo (accumulate=) acumularUn total acumulado lee la columna de otro y no sortea nada por su cuenta, así que ambos son obligatorios
TDC240of= o reset= nombra una columna que no está declarada más arribaEl total se arma con una columna que ya existe — la misma regla que tiene parent=

<compute>

CódigoCuándo saltaCómo arreglarlo
TDC180Una etiqueta dentro de <compute> que el lenguaje de cálculo no tiene, o un predicado escrito fuera de <test>El mensaje nombra la etiqueta. Contrástela con el Lenguaje de cálculo — un predicado como <eq> solo vale dentro de <test>
TDC181<current>, <current_index> o <acc> fuera de su cuerpo de iteraciónSolo existen dentro de un <do> (o el <do> de un <reduce>)
TDC182<var name="X"> no nombra ningún <let> que lo envuelvaEnvuélvalo en <let name="X">…</let>, o corrija el nombre
TDC183Una operación binaria de compute no tiene dos hijos<add>, <subtract> … toman exactamente dos operandos
TDC184<choose> no tiene rama <otherwise>Agregue <otherwise> — cada registro necesita una respuesta
TDC185Un <let name="X"> tapa una vinculación externa del mismo nombreRenombre una — la interna ocultaría la externa
TDC186<encode>: codificación desconocidaUna de: base36, ascii, unicode, hex, binary, octal
TDC187A un predicado le falta su hijo envoltorio<when> quiere <test>, <choose> quiere <then> — el mensaje nombra el par
TDC188<int v="…"> no es un número enteroEscriba un entero; para texto use <str v="…"/>
TDC189<compute> tiene más de un <result>Deje un solo <result> — los anteriores se descartarían

<mix>, <switch>, fixtures

CódigoCuándo saltaQué hacer
TDC120<mix> no tiene ningún <case>Una mezcla necesita ramas entre las que elegir
TDC121Un percent sobre un <mix>/<switch> tiene más entradas que casosUn porcentaje por caso
TDC122Una entrada de percent sobre un <mix>/<switch> no es un número no negativoLas posiciones llenas son números
TDC123percent sobre un <mix>/<switch> no suma 100Ajuste los valores a 100
TDC124<mix> tiene un hijo que no es <case>Allí solo puede ir <case>
TDC125<case> tiene un hijo desconocidoSe permiten <data>, <gen>, <mix>
TDC131Dentro de una fixture hay una etiqueta que las fixtures no aceptanLas fixtures solo llevan <line> y <data>
TDC132Dentro de <line> hay una etiqueta que no correspondeEl bloque de salida es disposición; los generadores viven en <env>
TDC133<switch> no tiene onNombre la secuencia sobre la que se conmuta
TDC134on nombra una secuencia, o un campo suyo, que no existeRevise el nombre — el mensaje dice cuál de las dos mitades falla
TDC135<switch> no tiene entradasAgregue <map>, <case> o <default>
TDC136(advertencia) Una fila de <map> no es CLAVE:VALOR — la fila mala se omite y el resto del mapa sigue aplicandoUn par por entrada, separado por dos puntos
TDC137Un <case> dentro de <switch> no tiene isis es la clave de la rama
TDC245name en un <switch> escrito dentro de un <case>La forma anidada aporta un valor a esa rama; solo un <switch> a nivel de <env> se convierte en columna

Fechas

CódigoCuándo saltaQué hacer
TDC150Solo se dio uno de from / toAmbos extremos o ninguno
TDC151El valor de fecha no parseavalue="2020-01-01..2025-12-31", "birth", "today", "now"
TDC152Un token de format es desconocidoVer la tabla de tokens
TDC153local nombra un locale sin datos de fechaIncluidas: en, es, ru, zh-cn
TDC154precision no es un paso admitidoVer precision

Durante la generación

Estos surgen al generar, no al validar: el config es correcto, pero la combinación no se puede llevar a cabo.

CódigoCuándo saltaQué hacer
TDC160row="…" en un <gen> en líneaEl enlace por fila necesita un <sequence>
TDC161Se usan opciones ponderadas de advanced_regex en líneaLos porcentajes exactos se calculan sobre toda la columna — muévalo a un <sequence>
TDC162En un contador en línea value o step no es numéricovalue="1" step="2"
TDC170Un archivo de data pack no se puede cargarEl mensaje nombra el archivo — ver Escribir los suyos
TDC171(advertencia) Un archivo de data pack no obtiene dirección, así que se omiteAñada address: o locale: a su cabecera, o muévalo bajo una carpeta de locale
TDC200(advertencia) La estimación de memoria es una parte grande de la RAM de esta máquina — el run continúaPara conjuntos muy grandes use mode="disk", la memoria se mantiene plana
TDC201La estimación de memoria supera la RAM de esta máquinaBaje count, divida el run, o use mode="disk"
A tres de estos no se llega desde una configuración

TDC160, TDC161 y TDC162 describen un <gen> en línea — escrito directamente dentro de <line> en vez de en un <sequence>. La validación rechaza esa forma antes, con TDC131 (a <gen> is not allowed inside <line>) o TDC013, así que una configuración real nunca llega tan lejos. Solo se alcanzan por el export de bajo nivel render(parse(src).tree), que recorre un árbol sin validar a propósito. Por eso mismo no existen en los cuatro ports: compilan la configuración en un modelo donde ese <gen> no tiene dónde ir.

Formato y modificadores

CódigoCuándo saltaQué hacer
TDC190case no es una transformación conocidaupper, lower, capitalize, title
TDC191order no es random ni sequentialEsos son los dos
TDC192Un filtro de interpolación es desconocidoVer Máscaras y mayúsculas
TDC193${{Name}} o ${{Name.field}} nombra algo no declaradoSe imprimiría literal — se comprueba la referencia entera, campo incluido
TDC194Un <data> tipado no tiene nameSolo un <data> con nombre se vuelve columna
TDC195repeat no es un número ni un rangorepeat="3" o repeat="1..5" (de 0 a 64)
TDC196repeat se usa en <mix>Una mezcla elige una rama; no produce una lista
TDC198separator sin repeatUne valores repetidos, así que tiene que haberlos
TDC199Un índice de mask está mal formadoLos índices empiezan en 0 y los rangos usan ..x[0..3], w[-1]
TDC202Hay flag pero ningún <case> marcado anomaly="true"La columna saldría toda en negativo — marque la rama atípica
TDC203flag en un <mix> anidadoSolo una mezcla con nombre a nivel <env> lleva la columna-respuesta
TDC204repeat en un generador que no puede repetirEl mensaje nombra el tipo
TDC206each="" no nombra ninguna secuenciaNombre la lista a recorrer
TDC207each nombra una secuencia de un solo valorTiene que ser una lista — agregue repeat en el origen
TDC209Un <data> con nombre dentro de una línea con each=Esa línea produce varias filas, y el nombre de columna queda ambiguo
TDC211weight en un generador que no es fileLos pesos vienen de una columna del CSV
TDC212weight sin columnLos pesos viven en una segunda columna, que hay que nombrar
TDC213weight junto con orderorder recorre las filas por posición; ponderar las elige por frecuencia

Vea también