Skip to content

[Rust] Invalid codegen for composite type with sinceVersion #1028

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Closed
marciorasf opened this issue Nov 21, 2024 · 2 comments
Closed

[Rust] Invalid codegen for composite type with sinceVersion #1028

marciorasf opened this issue Nov 21, 2024 · 2 comments

Comments

@marciorasf
Copy link
Contributor

marciorasf commented Nov 21, 2024

For the sample schema:

<sbe:messageSchema
	xmlns:ns2="http://www.fixprotocol.org/ns/simple/1.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:sbe="http://fixprotocol.io/2016/sbe"
	package="b3.entrypoint.fixp.sbe"
	id="1"
	version="4"
	semanticVersion="8.2.3"
	description="B3 Binary Entrypoint FIXP messages"
	byteOrder="littleEndian"
	xsi:schemaLocation="http://fixprotocol.io/2016/sbe sbe.xsd">
	<types>
		<set name="EventIndicator" encodingType="uint8" description="Set of indicators for a given event. First use case: indicates possible retransmission of message during recovery process." sinceVersion="4">
			<choice name="PossResend" description="1=Message is sent during recovery process, 0=Normal message.">0</choice>
		</set>
		<composite name="messageHeader" description="Message identifiers and length of message root.">
			<type name="blockLength" primitiveType="uint16" description="Length of the root of the FIX message contained before repeating groups or variable/conditions fields."/>
			<type name="templateId" primitiveType="uint16" description="Template ID used to encode the message."/>
			<type name="schemaId" primitiveType="uint16" description="ID of the system publishing the message."/>
			<type name="version" primitiveType="uint16" description="Schema version."/>
		</composite>
		<composite name="OutboundBusinessHeader" description="Header used for outbound business messages.">
			<ref name="eventIndicator" type="EventIndicator" sinceVersion="4"/>
		</composite>
	</types>

	<sbe:message name="ExecutionReport_New" id="200" description="Execution Report - New message is sent in response to a NewOrderSingle or SimpleNewOrder messages, or also from a restated iceberg order.">
		<field name="businessHeader" type="OutboundBusinessHeader" id="35524" description="Common header to all outbound business messages."/>
	</sbe:message>
</sbe:messageSchema>

CLI tool 1.33.2 generates Rust code that doesn't compile due to:

error[E0599]: the method `acting_version` exists for reference `&OutboundBusinessHeaderDecoder<P>`, but its trait bounds were not satisfied
   --> crates/b3_entrypoint_fixp_sbe/src/outbound_business_header_codec.rs:101:21
    |
58  |     pub struct OutboundBusinessHeaderDecoder<P> {
    |     ------------------------------------------- doesn't satisfy `OutboundBusinessHeaderDecoder<P>: ActingVersion`
...
101 |             if self.acting_version() < 4 {
    |                     ^^^^^^^^^^^^^^ method cannot be called on `&OutboundBusinessHeaderDecoder<P>` due to unsatisfied trait bounds    

OutboundBusinessHeaderDecoder does implement self.acting_version(), but just for a P: Reader<'a> + ActingVersion + Default:

impl<'a, P> ActingVersion for OutboundBusinessHeaderDecoder<P>
where
    P: Reader<'a> + ActingVersion + Default,
{
    #[inline]
    fn acting_version(&self) -> u16 {
        self.parent.as_ref().unwrap().acting_version()
    }
}

And error occurs because it's trying to use self.acting_version() for a P that does not implement ActingVersion:

impl<'a, P> OutboundBusinessHeaderDecoder<P>
where
    P: Reader<'a> + Default,
{
    /// BIT SET DECODER
    #[inline]
    pub fn event_indicator(&self) -> event_indicator::EventIndicator {
        if self.acting_version() < 4 {
            return event_indicator::EventIndicator::default();
        }

        event_indicator::EventIndicator::new(self.get_buf().get_u8_at(self.offset))
    }
}

It seems that this problem is a continuation of this one: #984 which was already closed.

@mward
Copy link
Contributor

mward commented Dec 12, 2024

I'll take a look

mward pushed a commit to mward/simple-binary-encoding that referenced this issue Dec 12, 2024
@mward
Copy link
Contributor

mward commented Dec 12, 2024

@marciorasf I submitted a PR #1037 that resolves this... thanks!

vyazelenko pushed a commit that referenced this issue Dec 13, 2024
* [Rust] updated LibRsDef.generate() to add "#![allow(clippy::all)]"

* [Rust] generating 'From<ENUM> for PRIMITIVE' instead of 'Into<PRIMITIVE> for ENUM' to satisfy 'from_over_into' lint

* [Rust] removed unused method parameter

* fixed formatting

* [Rust] Updated code generator to resolve Issue #1022

* [Rust] meant issue #1028 not 1022 (renamed files accordingly)

---------

Co-authored-by: Michael Ward <mward@drw.com>
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants