import { isThemisSchema } from '~/data/helpers/is-themis-schema'; import { IGetSchema } from '~/infra/joi/protocols'; import { IParseNestedSchemas } from '~/infra/joi/protocols/parse-nested-schemas'; export class JoiParseNestedStructure implements IParseNestedSchemas { constructor(public readonly getSchema: IGetSchema.Any) {} public parseSchema = (schema: any): any => { if (isThemisSchema(schema)) { return this.getSchema.getJoiSchema(schema.type, schema.rules); } return schema; }; public parseRules = (shape: any): any => { if (Array.isArray(shape)) { return shape.map(schemaOrRule => this.getParsedItem(schemaOrRule)); } if (typeof shape === 'object') { const joiShape: any = {}; Object.entries(shape).forEach(([key, schemaOrRule]) => (joiShape[key] = this.getParsedItem(schemaOrRule))); return joiShape; } }; public getParsedItem = (schemaOrRule: any) => { if (isThemisSchema(schemaOrRule)) { const schema = schemaOrRule; return this.getSchema.getJoiSchema(schema.type, schema.rules); } else { const rule = schemaOrRule; return this.parseRules(rule); } }; }