tolk-codegen
Version:
## Example generator ### Create builder file in root folder ``builder.ts``
63 lines (62 loc) • 2.05 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseCell = parseCell;
exports.sliceParser = sliceParser;
const core_1 = require("@ton/core");
const decorators_1 = require("../decorators");
const travel_1 = require("../travel");
const parser = {
[decorators_1.DataType.SLICE]: (slice, field) => {
if (field.size) {
return (0, core_1.beginCell)().storeBits(slice.loadBits(field.size)).asSlice();
}
else {
return (0, core_1.beginCell)().storeBits(slice.loadBits(slice.remainingBits)).asSlice();
}
},
[decorators_1.DataType.BIT]: (slice, field) => {
return slice.loadBit();
},
[decorators_1.DataType.COINS]: (slice, field) => {
return slice.loadCoins();
},
[decorators_1.DataType.INT]: (slice, field) => {
return slice.loadIntBig(field.size);
},
[decorators_1.DataType.UINT]: (slice, field) => {
return slice.loadUintBig(field.size);
},
[decorators_1.DataType.REF]: (slice, field) => {
if (field.type == core_1.Cell) {
return slice.loadRef();
}
else {
return parseCell(slice.loadRef(), field.type);
}
},
[decorators_1.DataType.ADDRESS]: (slice, field) => {
return slice.loadMaybeAddress();
},
[decorators_1.DataType.STRING_TAIL]: (slice, field) => {
return slice.loadStringTail();
},
[decorators_1.DataType.DICT]: (slice, field) => {
return slice.loadDict(field.dict.key, field.dict.value);
},
};
function parseCell(cell, type) {
return sliceParser(cell.beginParse(), type);
}
function sliceParser(slice, type) {
const object = new type();
(0, travel_1.travel)(type, (prototype, field) => {
if (!parser[field.buildType]) {
throw `${field.buildType} data type`;
}
if (field.mayBe && !slice.loadBit()) {
return;
}
object[field.name] = parser[field.buildType](slice, field);
});
return object;
}