docs: def GetValueLength(rd, pos):
    """Get value length for a key in rd.
  
    For a key at position pos in the Report Descriptor rd, return the length
    of the associated value.  This supports both short and long format
    values.
  
    Args:
      rd: Report Descriptor
      pos: The position of the key in rd.
  
    Returns:
      (key_size, data_len) where key_size is the number of bytes occupied by
      the key and data_len is the length of the value associated by the key.
    """
    rd = bytearray(rd)
    key = rd[pos]
    if key == LONG_ITEM_ENCODING:
      # If the key is tagged as a long item (0xfe), then the format is
      # [key (1 byte)] [data len (1 byte)] [item tag (1 byte)] [data (n # bytes)].
      # Thus, the entire key record is 3 bytes long.
      if pos + 1 < len(rd):
        return (3, rd[pos + 1])
      else:
        raise errors.HidError('Malformed report descriptor')
  
    else:
      # If the key is tagged as a short item, then the item tag and data len are
      # packed into one byte.  The format is thus:
      # [tag (high 4 bits)] [type (2 bits)] [size code (2 bits)] [data (n bytes)].
      # The size code specifies 1,2, or 4 bytes (0x03 means 4 bytes).
      code = key & 0x03
      if code <= 0x02:
        return (1, code)
      elif code == 0x03:
        return (1, 4)
  
    raise errors.HidError('Cannot happen')