1
0
Fork 0
mirror of https://github.com/demostf/demo.js synced 2026-06-04 09:04:13 +02:00

encoder for parser generator definitions

This commit is contained in:
Robin Appelman 2017-08-12 15:00:36 +02:00
commit 1e21b24763
3 changed files with 88 additions and 4 deletions

View file

@ -3,7 +3,7 @@ import {Match} from '../../Data/Match';
import {Packet} from '../../Data/Packet';
export type Parser = (stream: BitStream, match?: Match, skip?: boolean) => Packet;
export type Encoder = (packet: Packet, match: Match, stream: BitStream) => void;
export type Encoder = (packet: Packet, stream: BitStream, match?: Match) => void;
export interface PacketHandler {
parser: Parser,

View file

@ -1,5 +1,5 @@
import {Packet} from '../../Data/Packet';
import {PacketHandler, voidEncoder} from './Parser';
import {PacketHandler} from './Parser';
export function make(name: string, definition: string): PacketHandler {
const parts = definition.split('}');
@ -23,7 +23,11 @@ export function make(name: string, definition: string): PacketHandler {
}
return result as Packet;
},
encoder: voidEncoder
encoder: (packet, stream) => {
for (const group of items) {
writeItem(stream, group[1], packet, packet[group[0]]);
}
}
};
}
@ -49,3 +53,26 @@ function readItem(stream, description, data) {
return stream.readBits(parseInt(description, 10), true);
}
}
function writeItem(stream, description, data, value) {
if (description[0] === 'b') {
return stream.writeBoolean(value);
} else if (description[0] === 's') {
if (description.length === 1) {
return stream.writeUTF8String(value);
} else {
const length = parseInt(description.substr(1), 10);
return stream.writeUTF8String(value, length);
}
} else if (description === 'f32') {
return stream.writeFloat32(value);
} else if (description[0] === 'u') {
const length = parseInt(description.substr(1), 10);
return stream.writeBits(value, length);
} else if (description[0] === '$') {
const variable = description.substr(1);
return stream.writeBits(value, data[variable]);
} else {
return stream.writeBits(value, parseInt(description, 10), true);
}
}