-
Notifications
You must be signed in to change notification settings - Fork 7
Have "Complex Tokens" that are length-independent... #3
Description
Would it be possible to create a custom complex token that doesn't know it's len property?
I.E. I'm trying to make a CharDelimiter custom token that works similar to String#split, and returns a token when it finds a specified Char (maybe a space, " "):
function CharDelimiter(delim) {
this.get = function(buf, off) {
for (var i=off, l=buf.length; i<l; i++) {
if (buf[i] == delim.charCodeAt(0)) {
return buf.slice(off, i-1);
}
}
}
}
var stream = new EventEmitter();
strtok.parse(stream, function(v) {
if (v === undefined) {
return new CharDelimiter(" ");
}
console.error(v);
return new CharDelimiter(" ");
});
stream.emit("data", new Buffer("this is a test"));
//-> this
//-> is
//-> a
//-> test
Looking at the current way it's set up, this might be hard to implement. And I realize that it might just be easier to implement in a new module. But frankly, I thought that some sort of way to split a token on a certain char or String would be build-in functionality, since that's how the C version kinds works.
I think it would work if the get function were allowed to return a special value (similar to DEFER, lets call it WAIT), which meant that the Buffer didn't have whatever the custom token was looking for (yet) and to re-invoke the get method after another data event is received. Then my CharDelimiter function might look something like:
function CharDelimiter(delim) {
this.get = function(buf, off) {
for (var i=off, l=buf.length; i<l; i++) {
if (buf[i] == delim.charCodeAt(0)) {
return buf.slice(off, i-1);
}
}
// If we didn't find the delimiter, wait til the next 'data' event
return strtok.WAIT;
}
}
What are your thoughts on an API like this? Maybe even reusing the DEFER object itself, since their meaning is similar.
Thanks in advance!