docs: function parseObject(obj) {
      const proto = {};
      const nestProtos = {};
      const tags = {};
  
      for (const name in obj) {
          if (obj.hasOwnProperty(name)) {
              const tag = obj[name];
              const params = name.split(' ');
  
              switch (params[0]) {
              case 'message':
                  if (params.length === 2) {
                      nestProtos[params[1]] = parseObject(tag);
                  }
                  break;
              case 'required':
              case 'optional':
              case 'repeated': {
                  // params length should be 3 and tag can't be duplicated
                  if (params.length === 3 && !tags[tag]) {
                      proto[params[2]] = {
                          option: params[0],
                          type: params[1],
                          tag: tag
                      };
                      tags[tag] = params[2];
                  }
                  break;
              }
              default:
                  break;
              }
          }
      }
  
      proto.__messages = nestProtos;
      proto.__tags = tags;
      return proto;
  }