UNPKG

matefixjs

Version:
102 lines (81 loc) 2.68 kB
// builtin var fs = require('fs'); var util = require('util'); // 3rd party var xml2js = require('xml2js'); var Msg = require('./msg'); // message type -> message constructor module.exports.types = {} // load resource file var data = fs.readFileSync(__dirname + '/../resources/FIX42.xml'); var parser = new xml2js.Parser(); parser.parseString(data, function (err, result) { // map of field name to number var field_map = { }; // map of number to id var rev_field_map = { }; result.fields.field.forEach(function(field) { var number = field['@'].number; var name = field['@'].name; field_map[name] = number; rev_field_map[number] = name; }); result.messages.message.forEach(function(message) { var name = message['@'].name; var type = message['@'].msgtype; var field_properties = []; // new message class var msg_t = function() { var self = this; Msg.call(self); self.MsgType = type; self.name = name; field_properties.forEach(function(prop) { var name = prop.name; var id = prop.id; Object.defineProperty(self, name, { get: function() { return self.get(id); }, set: function(value) { self.set(id, value); }, }); }); }; msg_t.prototype = new Msg(); msg_t.prototype.toString = function() { var self = this; var res = ''; // this handles printing custom fields which we don't know the name of var fields = Object.keys(self._fields); fields.forEach(function(field_id) { var val = self.get(field_id); var name = field_id; if (rev_field_map[field_id]) { name = rev_field_map[field_id]; } res += name + '=' + val + ' '; }); return res; }; if (!(message.field instanceof Array)) { message.field = [message.field]; } message.field.forEach(function(field) { var field_name = field['@'].name; var field_id = field_map[field_name]; if (!field_id) { return; } field_properties.push({ name: field_name, id: field_id, }); }); module.exports[name] = msg_t; module.exports.types[type] = msg_t; }); });