JSFiddle - React, Tailwind, and code Playground

by Prathameshsb

JavaScript

'use strict';

const fs = require('fs');

process.stdin.resume();
process.stdin.setEncoding('utf-8');

let inputString = '';

process.stdin.on('data', function(inputStdin) {
    inputString += inputStdin;
});

process.stdin.on('end', function() {
    inputString;

    main(inputString);
});


/* Implement the validate function below.
 *
 * Remember, there are three kinds of validation errors:
 *
 * {ok: false, message: `${name} is required`}
 * {ok: false, message: `type ${type} expected for ${name}`}
 * {ok: false, message: `unexpected property ${name}`}
 *
 * There four possible `types` a property can have:
 * string, number, boolean, and array:employee
 */

function validate(employees, schema) {
  // Complete this function!
  
  function validateEmployee(employee, schema) {
      for(const {name, required, type} of schema.employee) {
        const value = employee[name];
        const actualType = Array.isArray(value) ? 'array:employee' : typeof value;
        
        if(required && value === undefined) {
            return {ok: false, message: `${name} is required`};
        }
        
        if(value !== undefined && actualType !== type) {
            return {ok: false, message: `type ${type} expected for ${name}`};
        };
      }
      const validProps = schema.employee.map(prop => prop.name);
      for(const prop in employee) {
          if(!validProps.includes(prop)) {
              return {ok: false, message: `unexpected property ${prop}`};
          }
      }
      
      for(const key of ['reports', 'subordinates']) {
          if(employee[key]) {
              for(const report of employee[key]) {
                  const result = validateEmployee(report, schema);
                  if(!result.ok) return result;
              }
          }
      }
      return {ok: true, message: 'success'}
  }
  
  for(const employee of employees) {
      const result = validateEmployee(employee, schema);
      if(!result.ok) return result;
  }
  
  return { ok:...