import {validateObject} from './validate_object'; import {validateString} from './validate_string'; import {ValidationError} from '../error/validation_error'; interface ValidateSpriteOptions { key: 'sprite'; value: unknown; // we don't know how the user defined the "sprite" validateSpec: Function; } export function validateSprite(options: ValidateSpriteOptions) { let errors = []; const sprite = options.value; const key = options.key; if (!Array.isArray(sprite)) { return validateString({ key, value: sprite }); } else { const allSpriteIds = []; const allSpriteURLs = []; for (const i in sprite) { if (sprite[i].id && allSpriteIds.includes(sprite[i].id)) errors.push( new ValidationError( key, sprite, `all the sprites' ids must be unique, but ${sprite[i].id} is duplicated` ) ); allSpriteIds.push(sprite[i].id); if (sprite[i].url && allSpriteURLs.includes(sprite[i].url)) errors.push( new ValidationError( key, sprite, `all the sprites' URLs must be unique, but ${sprite[i].url} is duplicated` ) ); allSpriteURLs.push(sprite[i].url); const pairSpec = { id: { type: 'string', required: true }, url: { type: 'string', required: true } }; errors = errors.concat( validateObject({ key: `${key}[${i}]`, value: sprite[i], valueSpec: pairSpec, validateSpec: options.validateSpec }) ); } return errors; } }