code: function checkMsg(msg, protos){
      if(!protos){
        return false;
      }
  
      for(var name in protos){
        var proto = protos[name];
  
        //All required element must exist
        switch(proto.option){
          case 'required' :
            if(typeof(msg[name]) === 'undefined'){
              return false;
            }
          case 'optional' :
            if(typeof(msg[name]) !== 'undefined'){
              if(!!protos.__messages[proto.type]){
                checkMsg(msg[name], protos.__messages[proto.type]);
              }
            }
          break;
          case 'repeated' :
            //Check nest message in repeated elements
            if(!!msg[name] && !!protos.__messages[proto.type]){
              for(var i = 0; i < msg[name].length; i++){
                if(!checkMsg(msg[name][i], protos.__messages[proto.type])){
                  return false;
                }
              }
            }
          break;
        }
      }
  
      return true;
    }
docs: Check if the msg follow the defination in the protos