create varstruct codec that can match multiple data types.
Each item encoded is prefixed with a type value, I suggest using a byte or a varint.
var varmatch = require('varstruct-match')
var varstruct = require('varstruct')
var VarUIntProtobuf = require('varint')
//create some simple codecs
var foobar = varstruct([
{ name: 'foo', type: VarUIntProtobuf },
{ name: 'bar', type: VarUIntProtobuf }
])
//test functions - return true if the argument can be encoded with this codec.
function isFooBar (t) { return t && t.foo && t.bar }
function isInteger (n) { return typeof n === 'number' && n % 1 === 0 }
var codec = varmatch(VarUIntProtobuf, [
{ match: 1, type: foobar, test: isFooBar },
{ match: 2, type: varstruct.VarArray(VarUIntProtobuf, foobar), test: Array.isArray },
{ match: 3, type: VarUIntProtobuf, test: isInteger }
])
//encode with the first rule
codec.encode({ foo: 1, bar: 2 })
//=> <Buffer 01 01 02>
//encode with the second rule
codec.encode([{ foo: 1, bar: 2 }, { foo: 3, bar: 4 }, { foo: 5, bar: 6 }])
//=> <Buffer 02 03 01 02 03 04 05 06>
//encode with the third rule
codec.encode(7)
//=> <Buffer 03 07>
once the codec is defined, you can just pass any valid object.
create an instance, specifying the codec for the matching field.
MIT