code: func parsePositionalArguments(rawArgs json.RawMessage, types []reflect.Type) ([]reflect.Value, error) {
  	dec := json.NewDecoder(bytes.NewReader(rawArgs))
  	var args []reflect.Value
  	tok, err := dec.Token()
  	switch {
  	case err == io.EOF || tok == nil && err == nil:
  		// "params" is optional and may be empty. Also allow "params":null even though it's
  		// not in the spec because our own client used to send it.
  	case err != nil:
  		return nil, err
  	case tok == json.Delim('['):
  		// Read argument array.
  		if args, err = parseArgumentArray(dec, types); err != nil {
  			return nil, err
  		}
  	default:
  		return nil, errors.New("non-array args")
  	}
  	// Set any missing args to nil.
  	for i := len(args); i < len(types); i++ {
  		if types[i].Kind() != reflect.Ptr {
  			return nil, fmt.Errorf("missing value for required argument %d", i)
  		}
  		args = append(args, reflect.Zero(types[i]))
  	}
  	return args, nil
  }
docs: // parsePositionalArguments tries to parse the given args to an array of values with the
  // given types. It returns the parsed values or an error when the args could not be
  // parsed. Missing optional arguments are returned as reflect.Zero values.