# Construir um pipeline de processamento com transforms

> Registe vários passos sob um nome com NEWTRANSFORM() e faça passar um valor por eles, por ordem, com TRANSFORM().

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: pt
Content-SHA256: 90e2e3adb541357202336ffcf575f3230ec8e0e5190c534c5269d30d65834a90
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

Um transform é uma cadeia de passos com nome. `NEWTRANSFORM(name, fn, [id])` acrescenta um passo à cadeia `name`; os passos correm pela ordem em que foram registados, e cada um recebe o objeto de opções `$` e o valor atual. Altere o valor com `$.value = ...` e chame `$.next()` para continuar com o passo seguinte. `$.invalid(message)` acrescenta um erro. `TRANSFORM(name, value)` inicia a cadeia e devolve uma promessa com o valor final; a promessa é rejeitada quando um passo reportou um erro. Com um callback em vez disso, `TRANSFORM(name, value, function(err, value) {})`. Um nome sem qualquer passo devolve o valor tal como está.

Use-o para trabalho que tem de poder ser estendido a partir de vários sítios, como limpar um comentário antes de o guardar: um filtro de spam, um removedor de espaços e um verificador de ligações podem viver cada um no seu ficheiro e ser acrescentados ou retirados sem mexer no código que chama `TRANSFORM()`. O `id` opcional permite remover um passo mais tarde com `NEWTRANSFORM(name, null, id)`.

```js definitions/transforms.js
NEWTRANSFORM('comment', function($, value) {
	$.value = value.trim();
	$.next();
}, 'trim');

NEWTRANSFORM('comment', function($, value) {
	if (/spam/i.test(value))
		$.invalid('Spam is not allowed');
	$.next();
}, 'spam');

NEWTRANSFORM('comment', function($, value) {
	$.value = value.replace(/\s+/g, ' ');
	$.next();
}, 'spaces');
```

```js controllers/comments.js
exports.install = function() {
	ROUTE('POST /comment/ @json', comment);
	ROUTE('DELETE /comment/spaces/', remove_step);
};

async function comment($) {
	try {
		var text = await TRANSFORM('comment', $.body.text);
		$.json({ text: text });
	} catch (err) {
		$.json({ error: true });
	}
}

function remove_step($) {
	NEWTRANSFORM('comment', null, 'spaces');
	$.success();
}
```
