Skip to content

Commit

Permalink
Split fields property to fields and constants.
Browse files Browse the repository at this point in the history
  • Loading branch information
baalexander committed Apr 15, 2012
1 parent c4d354a commit 37486d1
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 29 deletions.
46 changes: 29 additions & 17 deletions lib/messages.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,14 @@ messages.parseMessageFile = function(fileName, details, callback) {
return callback(error);
}
else {
extractFields(content, details, function(error, fields) {
extractFields(content, details, function(error, constants, fields) {
if (error) {
callback(error);
}
else {
details.fields = fields || [];
details.md5 = calculateMD5(details);
details.constants = constants;
details.fields = fields;
details.md5 = calculateMD5(details);
callback(null, details);
}
});
Expand Down Expand Up @@ -84,17 +85,11 @@ messages.getMessageFromFile = function(messageType, filePath, callback) {
function calculateMD5(details) {
var message = '';

var filteredConstants = details.fields.filter(function(field) {
return field.value;
});
message += filteredConstants.map(function(field) {
message += details.constants.map(function(field) {
return field.type + ' ' + field.name + '=' + field.value;
}).join('\n');

var filteredFields = details.fields.filter(function(field) {
return !field.value;
});
message += filteredFields.map(function(field) {
message += details.fields.map(function(field) {
if (field.messageType) {
return field.messageType.md5 + ' ' + field.name;
}
Expand All @@ -107,7 +102,10 @@ function calculateMD5(details) {
}

function extractFields(content, details, callback) {
var fields = [];
var constants = []
, fields = []
;

var parseLine = function(line, callback) {
line = line.trim();

Expand Down Expand Up @@ -137,7 +135,7 @@ function extractFields(content, details, callback) {
var constant = field.substring(equalIndex + 1, field.length).trim();
var parsedConstant = fieldsUtil.parsePrimitive(fieldType, constant);

fields.push({
constants.push({
name : fieldName
, type : fieldType
, value : parsedConstant
Expand Down Expand Up @@ -203,7 +201,7 @@ function extractFields(content, details, callback) {
callback(error);
}
else {
callback(null, fields);
callback(null, constants, fields);
}
});
};
Expand All @@ -222,14 +220,22 @@ function camelCase(underscoreWord, lowerCaseFirstLetter) {

function buildValidator (details) {
function validator (candidate, strict) {
return Object.keys(candidate).every(function(prop) {
return Object.keys(candidate).every(function(property) {
var valid = true;
var exists = false;
details.fields.forEach(function(field) {
if (field.name === prop) {

details.constants.forEach(function(field) {
if (field.name === property) {
exists = true;
}
});
if (!exists) {
details.fields.forEach(function(field) {
if (field.name === property) {
exists = true;
}
});
}

if (strict) {
return exists;
Expand All @@ -252,6 +258,11 @@ function buildMessageClass(details) {

var that = this;

if (details.constants) {
details.constants.forEach(function(field) {
that[field.name] = field.value || null;
});
}
if (details.fields) {
details.fields.forEach(function(field) {
that[field.name] = field.value || null;
Expand All @@ -269,6 +280,7 @@ function buildMessageClass(details) {
Message.packageName = Message.prototype.packageName = details.packageName;
Message.messageName = Message.prototype.messageName = details.messageName;
Message.md5 = Message.prototype.md5 = details.md5;
Message.constants = Message.prototype.constants = details.constants;
Message.fields = Message.prototype.fields = details.fields;
Message.prototype.validate = buildValidator(details);

Expand Down
27 changes: 15 additions & 12 deletions test/messages_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,21 @@ describe('Messages', function() {
var messagePath = path.join(__dirname, 'msg', 'test.msg');
messages.parseMessageFile(messagePath, null, function(error, details) {
should.not.exist(error);
details.fields.length.should.equal(14);

details.constants.length.should.equal(6);
details.fields.length.should.equal(8);

details.constants[3].type.should.equal('int32');
details.constants[3].name.should.equal('Y');
details.constants[3].value.should.equal(-123);

details.constants[4].type.should.equal('string');
details.constants[4].name.should.equal('FOO');
details.constants[4].value.should.equal('foo');

details.constants[5].type.should.equal('string');
details.constants[5].name.should.equal('EXAMPLE');
details.constants[5].value.should.equal('"#comments" are ignored, and leading and trailing whitespace removed');

details.fields[0].should.be.a('object');
details.fields[0].type.should.equal('bool');
Expand All @@ -37,17 +51,6 @@ describe('Messages', function() {
details.fields[7].type.should.equal('uint32');
details.fields[7].name.should.equal('max_contacts');

details.fields[11].type.should.equal('int32');
details.fields[11].name.should.equal('Y');
details.fields[11].value.should.equal(-123);

details.fields[12].type.should.equal('string');
details.fields[12].name.should.equal('FOO');
details.fields[12].value.should.equal('foo');

details.fields[13].type.should.equal('string');
details.fields[13].name.should.equal('EXAMPLE');
details.fields[13].value.should.equal('"#comments" are ignored, and leading and trailing whitespace removed');
done();
});
});
Expand Down

0 comments on commit 37486d1

Please sign in to comment.