[ https://issues.apache.org/jira/browse/THRIFT-5300?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17225622#comment-17225622 ]
Yuxuan Wang commented on THRIFT-5300: ------------------------------------- After reading more, the ids defined in the lists and sets section in TCompactProtocol spec is the same as the ides defined in the TBinaryProtocol spec, which is usually defined as TType in the implementations and used in all thrift compiled code regardless of the actual protocol (and defined in TProtocol interfaces in the implementations). So the getCompactType implementation found in go/java/cpp (and CTYPES defined in python implementation) are just how the TCompactProtocol implementations to translate from the universal type id (TType) into the one defined in TCompactProtocol spec (the struct encoding section). So my understanding is that the part in TCompactProtocol spec saying that the field ids are different in set/list/map is wrong (except that booleans need special handling, which is also implemented in the language libraries). It's the same as the struct encoding in all (or at least most) implementations. The fact that they all pass the cross language test also suggests that the implementations are consistent. If someone else can confirm my understanding (making sure I'm not reading it wrong), I can update the spec. > rs compact protocol collection elem type to ttype mapping wrong > --------------------------------------------------------------- > > Key: THRIFT-5300 > URL: https://issues.apache.org/jira/browse/THRIFT-5300 > Project: Thrift > Issue Type: Bug > Components: Rust - Library > Affects Versions: 0.13.0 > Reporter: shuo li > Assignee: Allen George > Priority: Major > Attachments: Screen Shot 2020-11-02 at 16.31.09.png, Screen Shot > 2020-11-02 at 16.31.31.png > > > collection_u8_to_type only overrides bool, but in spec, other types are > different too. > In field: > * {{BOOLEAN_TRUE}}, encoded as {{1}} > * {{BOOLEAN_FALSE}}, encoded as {{2}} > * {{BYTE}}, encoded as {{3}} > * {color:#FF0000}{{I16}}, encoded as {{4}}{color} > * {color:#FF0000}{{I32}}, encoded as {{5}}{color} > * {{I64}}, encoded as {{6}} > * {{DOUBLE}}, encoded as {{7}} > * {{BINARY}}, used for binary and string fields, encoded as {{8}} > * {{LIST}}, encoded as {{9}} > * {{SET}}, encoded as {{10}} > * {{MAP}}, encoded as {{11}} > * {{STRUCT}}, used for both structs and union fields, encoded as {{12}} > In colleciton: > * {{BOOL}}, encoded as {{2}} > * {{BYTE}}, encoded as {{3}} > * {{DOUBLE}}, encoded as {{4}} > * {color:#FF0000}{{I16}}, encoded as {{6}}{color} > * {color:#FF0000}{{I32}}, encoded as {{8}}{color} > * {{I64}}, encoded as {{10}} > * {{STRING}}, used for binary and string fields, encoded as {{11}} > * {{STRUCT}}, used for structs and union fields, encoded as {{12}} > * {{MAP}}, encoded as {{13}} > * {{SET}}, encoded as {{14}} > * {{LIST}}, encoded as {{15}} > {code:java} > // code placeholder > fn collection_u8_to_type(b: u8) -> crate::Result<TType> { > match b { > 0x01 => Ok(TType::Bool), > o => u8_to_type(o), > } > } > fn u8_to_type(b: u8) -> crate::Result<TType> { > match b { > 0x00 => Ok(TType::Stop), > 0x03 => Ok(TType::I08), // equivalent to TType::Byte > 0x04 => Ok(TType::I16), > 0x05 => Ok(TType::I32), > 0x06 => Ok(TType::I64), > 0x07 => Ok(TType::Double), > 0x08 => Ok(TType::String), > 0x09 => Ok(TType::List), > 0x0A => Ok(TType::Set), > 0x0B => Ok(TType::Map), > 0x0C => Ok(TType::Struct), > unkn => Err(crate::Error::Protocol(crate::ProtocolError { > kind: crate::ProtocolErrorKind::InvalidData, message: > format!("cannot convert {} into TType", unkn), > })), > }} > {code} > -- This message was sent by Atlassian Jira (v8.3.4#803005)