# Enums och stringformat valideringsgränser

> Kör positiva och negativa compact-schema kontroller för enum, färg, Base64, Zip, ikoner, JSON och IP format.

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

Kompakta enums använder `status:{draft|published}` (även semikolon skiljer valen åt). Strängen trimmas före den exakta, skiftlägeskänsliga medlemskapskontrollen. En obligatorisk enum avvisar ett utelämnat eller tomt värde. Nästlade objekt använder `{name:Type}`; de är inte enum-deklarationer.

I `total5@0.0.19` accepterar `Color` hexadecimalt `#RGB`, `#RRGGBB` och `#RRGGBBAA`; den accepterar inte CSS-färgnamn. `Icon` validerar ett klassnamnsmönster, inte att ikonresursen finns. `Base64` och `Zip` använder ramverkets validerare: att acceptera ett format är inte innehållsverifiering. I den kompakta schemaparsern i den här versionen är **`JSON` och `IP` inte kända subtyper och faller tillbaka på vanliga strängar**. Felaktig JSON och ogiltig IP-text accepteras. Det uttryckliga JSON-schemat nedan sätter inbyggda `subtype`-värden för att aktivera dessa kontroller; det tolkar inte en JSON-sträng till ett objekt. Använd inte `SafeString` i stället för bundna SQL-parametrar eller utdata-escaping.

```js controllers/formats.js
var schema = NEWSCHEMA('FormatBoundaries', '*status:{draft|published},*color:Color,*blob:Base64,*zip:Zip,*icon:Icon,*document:JSON,*address:IP');
var explicit = Total.newjsonschema('ExplicitFormats', { $id: 'ExplicitFormats', type: 'object', required: ['document','address'], properties: { document: { type: 'string', subtype: 'json' }, address: { type: 'string', subtype: 'ip' } } });
exports.install = function() {
	ROUTE('POST /explicit/ @json', function($) {
		var result = explicit.transform($.body);
		if (result.error) { $.response.status = 400; $.json({ error: 'invalid format' }); }
		else $.json(result.response);
	});
	ROUTE('POST /formats/ @json', formats);
};
function formats($) {
	var result = schema.transform($.body);
	if (result.error) {
		$.response.status = 400;
		$.json({ error: 'invalid format' });
	} else
		$.json(result.response);
}
```
