objectcomputing / mFAST

A FAST (FIX Adapted for STreaming) encoder/decoder
http://objectcomputing.github.io/mFAST
BSD 3-Clause "New" or "Revised" License
224 stars 112 forks source link

Parsing enum fields with name not a number - FAST v1.2 #86

Open benjaminfaul2 opened 5 years ago

benjaminfaul2 commented 5 years ago

Hello, I am trying to use mFAST with FAST v1.2 templates and it seems to throw a static error when an enum type has element names that are not numbers. E.g.

<define name="Answer">
    <enum>
      <element name="N" id="No"/>
      <element name="Y" id="Yes"/>
    </enum>
  </define>

Is there a way I can fix this? I'm trying to understand the code but it just seems to assume the element names must be a number.

Error:

Throw in function virtual void mfast::xml_parser::field_builder::visit(const mfast::enum_field_instruction*, void*)
Dynamic exception type: boost::exception_detail::clone_impl<mfast::fast_static_error>
std::exception::what: std::exception
[mfast::xml_parser::tag_value*] = 0
[mfast::tag_error_code*] = Unrecognized enum initial value :

Note: I am using the latest master as of 9-Sept-2019. Thanks

benjaminfaul2 commented 5 years ago

After further digging it appears that later in the template file, a message is defined using this value but with a default that doesn't correspond to any of the named values. E.g

<template id="123" name="ReplyMessage">
    <field name="ReplyAnswer" id="1234" presence="optional">
        <type name="Answer">
            <default value="0"/>
        </type>
    </field>
</template>

Is this invalid syntax?

Thanks

benjaminfaul2 commented 5 years ago

It seems the mFAST implementation of handling the default enum value is incorrect. See this link:

https://forum.fixtrading.org/t/default-value-for-enumeration-fast-1-2-extension/1236/2

The default value is the "on the wire" value not a enum field name.

SBAM commented 3 years ago

Hi, if you're interested, I addressed this in this fork https://github.com/SBAM/mFAST/commit/4a427bddadaf44f06b00ba42d9d3994cd4ab4ac4 If an id attribute is provided and matches, it will be selected, otherwise it falls back to the name attribute.