visitFromField()

in lib/generator.js [1238:1298]


  visitFromField(fieldValue, fieldName, key, value, level, arr = false) {
    const deep = Math.floor((level - 4) / 2);
    if (fieldValue.type === 'modelBody') {
      const subModelName = _subModelName(fieldName);
      this.emit(`temp_model = ${this.getModelName(subModelName)}()\n`, level);
      this.emitFieldConvert(key, `temp_model.from_map(${value})`, level, arr);
    } else if (fieldValue.type === 'array' || fieldValue.fieldType === 'array') {
      this.emit(`for k${deep} in ${value}:\n`, level);
      let subKey = key;
      if(deep > 1) {
        subKey = `l${deep - 1}`;
        this.emit(`${subKey} = []\n`, level + 2);
      }
      this.visitFromField(fieldValue.fieldItemType || fieldValue.subType, fieldName, `${subKey}`, `k${deep}`, level + 2, true);
      if(deep > 1) {
        this.emitFieldConvert(key, subKey, level, arr);
      }
    } else if (fieldValue.fieldType === 'map' || fieldValue.type === 'map') {
      this.emit(`for k${deep}, v${deep} in ${value}.items():\n`, level);
      let subKey = key;
      if(deep > 1) {
        subKey = `d${deep - 1}`;
        this.emit(`${subKey} = {}\n`, level + 2);
      }
      this.visitFromField(fieldValue.valueType, fieldName, `${subKey}[k${deep}]`, `v${deep}`, level + 2);
      if(deep > 1) {
        this.emitFieldConvert(key, subKey, level, arr);
      }
    } else if (fieldValue.type === 'moduleModel' || 
    (fieldValue.fieldType && fieldValue.fieldType.type === 'moduleModel')) {
      const [moduleId, ...rest] = fieldValue.path || fieldValue.fieldType.path;
      const modelName = _subModelName(rest.map((item) => {
        return item.lexeme;
      }).join('.'));
      this.emit(`temp_model = ${this.getModelName(modelName, _name(moduleId))}()\n`, level);
      this.emitFieldConvert(key, `temp_model.from_map(${value})`, level, arr);
    } else if (fieldValue.type === 'subModel') {
      const [moduleId, ...rest] = fieldValue.path;
      const subModelName = _subModelName([moduleId.lexeme, ...rest.map((item) => {
        return item.lexeme;
      })].join('.'));
      this.emit(`temp_model = ${this.getModelName(subModelName)}()\n`, level);
      this.emitFieldConvert(key, `temp_model.from_map(${value})`, level, arr);
    } else if (fieldValue.idType === 'model') {
      const modelName = _type(_name(fieldValue));
      this.emit(`temp_model = ${this.getModelName(modelName)}()\n`, level);
      this.emitFieldConvert(key, `temp_model.from_map(${value})`, level, arr);
    } else if (fieldValue.fieldType && fieldValue.fieldType.idType === 'model') {
      const modelName = _type(_name(fieldValue.fieldType));
      this.emit(`temp_model = ${this.getModelName(modelName)}()\n`, level);
      this.emitFieldConvert(key, `temp_model.from_map(${value})`, level, arr);
    } else if (fieldValue.fieldType && fieldValue.fieldType.idType === 'builtin_model') {
      const typeName = _type(_name(fieldValue.fieldType));
      this.pushImports(typeName);
      this.emit(`temp_model = ${typeName}()\n`, level);
      this.emitFieldConvert(key, `temp_model.from_map(${value})`, level, arr);
    } else {
      this.emitFieldConvert(key, value, level, arr);
    }
    
  }