@dusted/anqst 1.0.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -0
- package/dist/src/app.js +103 -77
- package/dist/src/base93.js +124 -0
- package/dist/src/build-stamp.js +1 -1
- package/dist/src/codecgenerators/basecodecemitters/bigint-qint64/decoder.js +35 -0
- package/dist/src/codecgenerators/basecodecemitters/bigint-qint64/encoder.js +36 -0
- package/dist/src/codecgenerators/basecodecemitters/bigint-quint64/decoder.js +26 -0
- package/dist/src/codecgenerators/basecodecemitters/bigint-quint64/encoder.js +38 -0
- package/dist/src/codecgenerators/basecodecemitters/binary-blob/decoder.js +28 -0
- package/dist/src/codecgenerators/basecodecemitters/binary-blob/encoder.js +34 -0
- package/dist/src/codecgenerators/basecodecemitters/binary-buffer/decoder.js +29 -0
- package/dist/src/codecgenerators/basecodecemitters/binary-buffer/encoder.js +36 -0
- package/dist/src/codecgenerators/basecodecemitters/binary-float32Array/decoder.js +46 -0
- package/dist/src/codecgenerators/basecodecemitters/binary-float32Array/encoder.js +49 -0
- package/dist/src/codecgenerators/basecodecemitters/binary-float64Array/decoder.js +46 -0
- package/dist/src/codecgenerators/basecodecemitters/binary-float64Array/encoder.js +47 -0
- package/dist/src/codecgenerators/basecodecemitters/binary-int16Array/decoder.js +46 -0
- package/dist/src/codecgenerators/basecodecemitters/binary-int16Array/encoder.js +49 -0
- package/dist/src/codecgenerators/basecodecemitters/binary-int32Array/decoder.js +50 -0
- package/dist/src/codecgenerators/basecodecemitters/binary-int32Array/encoder.js +52 -0
- package/dist/src/codecgenerators/basecodecemitters/binary-int8Array/decoder.js +38 -0
- package/dist/src/codecgenerators/basecodecemitters/binary-int8Array/encoder.js +44 -0
- package/dist/src/codecgenerators/basecodecemitters/binary-typedArray/decoder.js +33 -0
- package/dist/src/codecgenerators/basecodecemitters/binary-typedArray/encoder.js +34 -0
- package/dist/src/codecgenerators/basecodecemitters/binary-uint16Array/decoder.js +46 -0
- package/dist/src/codecgenerators/basecodecemitters/binary-uint16Array/encoder.js +49 -0
- package/dist/src/codecgenerators/basecodecemitters/binary-uint32Array/decoder.js +46 -0
- package/dist/src/codecgenerators/basecodecemitters/binary-uint32Array/encoder.js +49 -0
- package/dist/src/codecgenerators/basecodecemitters/binary-uint8Array/decoder.js +28 -0
- package/dist/src/codecgenerators/basecodecemitters/binary-uint8Array/encoder.js +34 -0
- package/dist/src/codecgenerators/basecodecemitters/boolean/decoder.js +34 -0
- package/dist/src/codecgenerators/basecodecemitters/boolean/encoder.js +40 -0
- package/dist/src/codecgenerators/basecodecemitters/dynamic-json/decoder.js +43 -0
- package/dist/src/codecgenerators/basecodecemitters/dynamic-json/encoder.js +45 -0
- package/dist/src/codecgenerators/basecodecemitters/dynamic-object/decoder.js +44 -0
- package/dist/src/codecgenerators/basecodecemitters/dynamic-object/encoder.js +46 -0
- package/dist/src/codecgenerators/basecodecemitters/integer-int16/decoder.js +32 -0
- package/dist/src/codecgenerators/basecodecemitters/integer-int16/encoder.js +43 -0
- package/dist/src/codecgenerators/basecodecemitters/integer-int32/decoder.js +26 -0
- package/dist/src/codecgenerators/basecodecemitters/integer-int32/encoder.js +37 -0
- package/dist/src/codecgenerators/basecodecemitters/integer-int8/decoder.js +26 -0
- package/dist/src/codecgenerators/basecodecemitters/integer-int8/encoder.js +37 -0
- package/dist/src/codecgenerators/basecodecemitters/integer-qint16/decoder.js +36 -0
- package/dist/src/codecgenerators/basecodecemitters/integer-qint16/encoder.js +36 -0
- package/dist/src/codecgenerators/basecodecemitters/integer-qint32/decoder.js +25 -0
- package/dist/src/codecgenerators/basecodecemitters/integer-qint32/encoder.js +36 -0
- package/dist/src/codecgenerators/basecodecemitters/integer-qint8/decoder.js +36 -0
- package/dist/src/codecgenerators/basecodecemitters/integer-qint8/encoder.js +36 -0
- package/dist/src/codecgenerators/basecodecemitters/integer-quint16/decoder.js +26 -0
- package/dist/src/codecgenerators/basecodecemitters/integer-quint16/encoder.js +38 -0
- package/dist/src/codecgenerators/basecodecemitters/integer-quint32/decoder.js +27 -0
- package/dist/src/codecgenerators/basecodecemitters/integer-quint32/encoder.js +39 -0
- package/dist/src/codecgenerators/basecodecemitters/integer-quint8/decoder.js +26 -0
- package/dist/src/codecgenerators/basecodecemitters/integer-quint8/encoder.js +38 -0
- package/dist/src/codecgenerators/basecodecemitters/integer-uint16/decoder.js +30 -0
- package/dist/src/codecgenerators/basecodecemitters/integer-uint16/encoder.js +42 -0
- package/dist/src/codecgenerators/basecodecemitters/integer-uint32/decoder.js +31 -0
- package/dist/src/codecgenerators/basecodecemitters/integer-uint32/encoder.js +43 -0
- package/dist/src/codecgenerators/basecodecemitters/integer-uint8/decoder.js +30 -0
- package/dist/src/codecgenerators/basecodecemitters/integer-uint8/encoder.js +40 -0
- package/dist/src/codecgenerators/basecodecemitters/number/decoder.js +26 -0
- package/dist/src/codecgenerators/basecodecemitters/number/encoder.js +38 -0
- package/dist/src/codecgenerators/basecodecemitters/shared/comments.js +13 -0
- package/dist/src/codecgenerators/basecodecemitters/shared/contracts.js +2 -0
- package/dist/src/codecgenerators/basecodecemitters/shared/fixedwidth.js +53 -0
- package/dist/src/codecgenerators/basecodecemitters/shared/index.js +21 -0
- package/dist/src/codecgenerators/basecodecemitters/shared/positionalBase93.js +48 -0
- package/dist/src/codecgenerators/basecodecemitters/shared/rawbytes.js +30 -0
- package/dist/src/codecgenerators/basecodecemitters/string/decoder.js +43 -0
- package/dist/src/codecgenerators/basecodecemitters/string/encoder.js +43 -0
- package/dist/src/codecgenerators/basecodecemitters/stringArray/decoder.js +80 -0
- package/dist/src/codecgenerators/basecodecemitters/stringArray/encoder.js +57 -0
- package/dist/src/emit.js +760 -120
- package/dist/src/structured-top-level-codecs.js +1305 -0
- package/package.json +2 -3
- package/spec/AnQst-Spec-DSL.d.ts +15 -8
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Base codec emitter (decode): base93 blob → TypeScript `number`, C++ `double`.
|
|
4
|
+
* Reconstructs IEEE 754 binary64 from eight decoded bytes (platform-native order).
|
|
5
|
+
* See RefinedSpecs/Codecs/Number_number_Codec.md and AnQst-Opaque-Wire-Contract.md §6.4.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.numberDecoderEmitter = exports.descriptor = void 0;
|
|
9
|
+
const comments_1 = require("../shared/comments");
|
|
10
|
+
const fixedwidth_1 = require("../shared/fixedwidth");
|
|
11
|
+
const encoder_1 = require("./encoder");
|
|
12
|
+
Object.defineProperty(exports, "descriptor", { enumerable: true, get: function () { return encoder_1.descriptor; } });
|
|
13
|
+
const strategyComment = (0, comments_1.emitStrategyComment)("Base codec emitter (decode): AnQst.Type.number / double", [
|
|
14
|
+
"Decodes base93 to bytes, then Float64Array (TS) or std::memcpy (C++).",
|
|
15
|
+
"Expects base93Decode in scope; standalone payloads are exactly 10 characters.",
|
|
16
|
+
"Round-trips all IEEE special values and distinct NaN payloads when produced by the encoder."
|
|
17
|
+
]);
|
|
18
|
+
exports.numberDecoderEmitter = {
|
|
19
|
+
descriptor: encoder_1.descriptor,
|
|
20
|
+
emitTsDecoder() {
|
|
21
|
+
return `${strategyComment}\n\n${(0, fixedwidth_1.emitTsFixedWidthStandaloneDecoder)("decodeAnQstNumber", encoder_1.descriptor.fixedWidth)}`;
|
|
22
|
+
},
|
|
23
|
+
emitCppDecoder() {
|
|
24
|
+
return `${strategyComment}\n\n${(0, fixedwidth_1.emitCppFixedWidthStandaloneDecoder)("decodeAnQstNumber", encoder_1.descriptor.fixedWidth)}`;
|
|
25
|
+
}
|
|
26
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Base codec emitter (encode): AnQst.Type.number ↔ TypeScript `number`, C++ `double`.
|
|
4
|
+
* Standalone wire shape is one base93 string of length 10 (8 IEEE 754 binary64 bytes).
|
|
5
|
+
* See RefinedSpecs/Codecs/Number_number_Codec.md and AnQst-Codec-Design-Principles.md §4.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.numberEncoderEmitter = exports.descriptor = void 0;
|
|
9
|
+
const comments_1 = require("../shared/comments");
|
|
10
|
+
const fixedwidth_1 = require("../shared/fixedwidth");
|
|
11
|
+
const fixedWidth = {
|
|
12
|
+
byteWidth: 8,
|
|
13
|
+
tsViewCtor: "Float64Array",
|
|
14
|
+
cppType: "double"
|
|
15
|
+
};
|
|
16
|
+
exports.descriptor = {
|
|
17
|
+
codecId: "AnQst.Type.number",
|
|
18
|
+
specPath: "RefinedSpecs/Codecs/Number_number_Codec.md",
|
|
19
|
+
tsType: "number",
|
|
20
|
+
cppType: "double",
|
|
21
|
+
wireCategory: "fixed-width-scalar",
|
|
22
|
+
strategySummary: "IEEE 754 binary64: 8 platform-native bytes packed via base93 (10 characters standalone).",
|
|
23
|
+
fixedWidth
|
|
24
|
+
};
|
|
25
|
+
const strategyComment = (0, comments_1.emitStrategyComment)("Base codec emitter (encode): AnQst.Type.number / double", [
|
|
26
|
+
"Uses Float64Array (TS) or std::memcpy (C++) for platform-native IEEE 754 bytes.",
|
|
27
|
+
"Emits base93 via shared fixed-width standalone helper (expects base93Encode in scope).",
|
|
28
|
+
"Preserves all bit patterns including ±0, NaN, ±Infinity, subnormals."
|
|
29
|
+
]);
|
|
30
|
+
exports.numberEncoderEmitter = {
|
|
31
|
+
descriptor: exports.descriptor,
|
|
32
|
+
emitTsEncoder() {
|
|
33
|
+
return `${strategyComment}\n\n${(0, fixedwidth_1.emitTsFixedWidthStandaloneEncoder)("encodeAnQstNumber", fixedWidth)}`;
|
|
34
|
+
},
|
|
35
|
+
emitCppEncoder() {
|
|
36
|
+
return `${strategyComment}\n\n${(0, fixedwidth_1.emitCppFixedWidthStandaloneEncoder)("encodeAnQstNumber", fixedWidth)}`;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.emitStrategyComment = emitStrategyComment;
|
|
4
|
+
function emitStrategyComment(title, bullets) {
|
|
5
|
+
const lines = [
|
|
6
|
+
"/**",
|
|
7
|
+
` * ${title}`,
|
|
8
|
+
" *",
|
|
9
|
+
...bullets.map((bullet) => ` * - ${bullet}`),
|
|
10
|
+
" */"
|
|
11
|
+
];
|
|
12
|
+
return lines.join("\n");
|
|
13
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.emitTsFixedWidthStandaloneEncoder = emitTsFixedWidthStandaloneEncoder;
|
|
4
|
+
exports.emitTsFixedWidthStandaloneDecoder = emitTsFixedWidthStandaloneDecoder;
|
|
5
|
+
exports.emitCppFixedWidthStandaloneEncoder = emitCppFixedWidthStandaloneEncoder;
|
|
6
|
+
exports.emitCppFixedWidthStandaloneDecoder = emitCppFixedWidthStandaloneDecoder;
|
|
7
|
+
function tsScalarBufferInit(descriptor, valueExpr) {
|
|
8
|
+
return [
|
|
9
|
+
`const buf = new ArrayBuffer(${descriptor.byteWidth});`,
|
|
10
|
+
`new ${descriptor.tsViewCtor}(buf)[0] = ${valueExpr};`,
|
|
11
|
+
"const bytes = new Uint8Array(buf);"
|
|
12
|
+
];
|
|
13
|
+
}
|
|
14
|
+
function tsScalarBufferRead(descriptor, bytesExpr) {
|
|
15
|
+
return [
|
|
16
|
+
`const buf = new ArrayBuffer(${descriptor.byteWidth});`,
|
|
17
|
+
`new Uint8Array(buf).set(${bytesExpr});`,
|
|
18
|
+
`return new ${descriptor.tsViewCtor}(buf)[0];`
|
|
19
|
+
];
|
|
20
|
+
}
|
|
21
|
+
function emitTsFixedWidthStandaloneEncoder(functionName, descriptor, valueExpr = "value") {
|
|
22
|
+
const lines = [
|
|
23
|
+
`function ${functionName}(value) {`,
|
|
24
|
+
...tsScalarBufferInit(descriptor, valueExpr).map((line) => ` ${line}`),
|
|
25
|
+
" return base93Encode(bytes);",
|
|
26
|
+
"}"
|
|
27
|
+
];
|
|
28
|
+
return lines.join("\n");
|
|
29
|
+
}
|
|
30
|
+
function emitTsFixedWidthStandaloneDecoder(functionName, descriptor) {
|
|
31
|
+
const lines = [
|
|
32
|
+
`function ${functionName}(encoded) {`,
|
|
33
|
+
" const bytes = base93Decode(encoded);",
|
|
34
|
+
...tsScalarBufferRead(descriptor, "bytes").map((line) => ` ${line}`),
|
|
35
|
+
"}"
|
|
36
|
+
];
|
|
37
|
+
return lines.join("\n");
|
|
38
|
+
}
|
|
39
|
+
function emitCppFixedWidthStandaloneEncoder(functionName, descriptor) {
|
|
40
|
+
return `inline std::string ${functionName}(const ${descriptor.cppType}& value) {
|
|
41
|
+
std::array<std::uint8_t, ${descriptor.byteWidth}> bytes{};
|
|
42
|
+
std::memcpy(bytes.data(), &value, ${descriptor.byteWidth});
|
|
43
|
+
return base93Encode(std::vector<std::uint8_t>(bytes.begin(), bytes.end()));
|
|
44
|
+
}`;
|
|
45
|
+
}
|
|
46
|
+
function emitCppFixedWidthStandaloneDecoder(functionName, descriptor) {
|
|
47
|
+
return `inline ${descriptor.cppType} ${functionName}(const std::string& encoded) {
|
|
48
|
+
const std::vector<std::uint8_t> bytes = base93Decode(encoded);
|
|
49
|
+
${descriptor.cppType} value{};
|
|
50
|
+
std::memcpy(&value, bytes.data(), ${descriptor.byteWidth});
|
|
51
|
+
return value;
|
|
52
|
+
}`;
|
|
53
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./comments"), exports);
|
|
18
|
+
__exportStar(require("./contracts"), exports);
|
|
19
|
+
__exportStar(require("./fixedwidth"), exports);
|
|
20
|
+
__exportStar(require("./positionalBase93"), exports);
|
|
21
|
+
__exportStar(require("./rawbytes"), exports);
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.emitPositionalBase93CountEncoder = emitPositionalBase93CountEncoder;
|
|
4
|
+
exports.emitPositionalBase93CountDecoder = emitPositionalBase93CountDecoder;
|
|
5
|
+
exports.emitPositionalBase93CountCppFunctions = emitPositionalBase93CountCppFunctions;
|
|
6
|
+
const base93_1 = require("../../../base93");
|
|
7
|
+
function emitPositionalBase93CountEncoder(functionName = "encodeBase93Count") {
|
|
8
|
+
return `function ${functionName}(value) {
|
|
9
|
+
var A = "${base93_1.BASE93_ALPHABET}", v = value >>> 0, out = "";
|
|
10
|
+
if (v === 0) return A[0];
|
|
11
|
+
while (v > 0) {
|
|
12
|
+
out = A[v % 93] + out;
|
|
13
|
+
v = (v / 93) | 0;
|
|
14
|
+
}
|
|
15
|
+
return out;
|
|
16
|
+
}`;
|
|
17
|
+
}
|
|
18
|
+
function emitPositionalBase93CountDecoder(functionName = "decodeBase93Count") {
|
|
19
|
+
return `function ${functionName}(value) {
|
|
20
|
+
var n = value.length, acc = 0, i, c;
|
|
21
|
+
for (i = 0; i < n; i++) {
|
|
22
|
+
c = value.charCodeAt(i);
|
|
23
|
+
acc = acc * 93 + c - 32 - (c > 34) - (c > 92);
|
|
24
|
+
}
|
|
25
|
+
return acc >>> 0;
|
|
26
|
+
}`;
|
|
27
|
+
}
|
|
28
|
+
function emitPositionalBase93CountCppFunctions() {
|
|
29
|
+
return `inline std::string encodeBase93Count(std::uint32_t value) {
|
|
30
|
+
static constexpr char A[] = "${base93_1.BASE93_ALPHABET}";
|
|
31
|
+
if (value == 0u) return std::string(1, A[0]);
|
|
32
|
+
std::string out;
|
|
33
|
+
while (value > 0u) {
|
|
34
|
+
out.insert(out.begin(), A[value % 93u]);
|
|
35
|
+
value /= 93u;
|
|
36
|
+
}
|
|
37
|
+
return out;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
inline std::uint32_t decodeBase93Count(const std::string& value) {
|
|
41
|
+
std::uint32_t acc = 0;
|
|
42
|
+
for (char c : value) {
|
|
43
|
+
const unsigned char uc = static_cast<unsigned char>(c);
|
|
44
|
+
acc = acc * 93u + static_cast<std::uint32_t>(uc - 32 - (uc > 34) - (uc > 92));
|
|
45
|
+
}
|
|
46
|
+
return acc;
|
|
47
|
+
}`;
|
|
48
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.emitTsRawByteStandaloneEncoder = emitTsRawByteStandaloneEncoder;
|
|
4
|
+
exports.emitTsRawByteStandaloneDecoder = emitTsRawByteStandaloneDecoder;
|
|
5
|
+
exports.emitCppRawByteStandaloneEncoder = emitCppRawByteStandaloneEncoder;
|
|
6
|
+
exports.emitCppRawByteStandaloneDecoder = emitCppRawByteStandaloneDecoder;
|
|
7
|
+
function emitTsRawByteStandaloneEncoder(functionName, valueToBytesExpr) {
|
|
8
|
+
return `function ${functionName}(value) {
|
|
9
|
+
const bytes = ${valueToBytesExpr};
|
|
10
|
+
return base93Encode(bytes);
|
|
11
|
+
}`;
|
|
12
|
+
}
|
|
13
|
+
function emitTsRawByteStandaloneDecoder(functionName, bytesToValueExpr) {
|
|
14
|
+
return `function ${functionName}(encoded) {
|
|
15
|
+
const bytes = base93Decode(encoded);
|
|
16
|
+
return ${bytesToValueExpr};
|
|
17
|
+
}`;
|
|
18
|
+
}
|
|
19
|
+
function emitCppRawByteStandaloneEncoder(functionName, valueToBytesExpr) {
|
|
20
|
+
return `inline std::string ${functionName}(const QByteArray& value) {
|
|
21
|
+
const std::vector<std::uint8_t> bytes = ${valueToBytesExpr};
|
|
22
|
+
return base93Encode(bytes);
|
|
23
|
+
}`;
|
|
24
|
+
}
|
|
25
|
+
function emitCppRawByteStandaloneDecoder(functionName, bytesToValueExpr) {
|
|
26
|
+
return `inline QByteArray ${functionName}(const std::string& encoded) {
|
|
27
|
+
const std::vector<std::uint8_t> bytes = base93Decode(encoded);
|
|
28
|
+
return ${bytesToValueExpr};
|
|
29
|
+
}`;
|
|
30
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* AnQstGen base-type codec emitter for `AnQst.Type.string`.
|
|
4
|
+
* Decoder is leaf identity: the JSON string value is the domain string. See RefinedSpecs/Codecs/String_string_Codec.md.
|
|
5
|
+
* C++ integration uses QVariant::toString() / QJsonValue::toString(); portable stubs below use std::string for tests without Qt.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.decoder = exports.descriptor = void 0;
|
|
9
|
+
const comments_1 = require("../shared/comments");
|
|
10
|
+
exports.descriptor = {
|
|
11
|
+
codecId: "string",
|
|
12
|
+
specPath: "RefinedSpecs/Codecs/String_string_Codec.md",
|
|
13
|
+
tsType: "string",
|
|
14
|
+
cppType: "QString",
|
|
15
|
+
wireCategory: "string",
|
|
16
|
+
strategySummary: "Native JSON string; leaf identity encode/decode; no base93."
|
|
17
|
+
};
|
|
18
|
+
const TS_FN = "decodeAnqstBase_string";
|
|
19
|
+
const CPP_FN = "decodeAnqstBase_string";
|
|
20
|
+
exports.decoder = {
|
|
21
|
+
descriptor: exports.descriptor,
|
|
22
|
+
emitTsDecoder() {
|
|
23
|
+
return [
|
|
24
|
+
(0, comments_1.emitStrategyComment)("AnQst string decoder (identity)", [
|
|
25
|
+
"Interprets the wire JSON string as the domain value; no transform.",
|
|
26
|
+
"No base93 decode path for string positions."
|
|
27
|
+
]),
|
|
28
|
+
`function ${TS_FN}(wire) {`,
|
|
29
|
+
" return wire;",
|
|
30
|
+
"}"
|
|
31
|
+
].join("\n");
|
|
32
|
+
},
|
|
33
|
+
emitCppDecoder() {
|
|
34
|
+
return [
|
|
35
|
+
(0, comments_1.emitStrategyComment)("AnQst string decoder (identity, portable stub)", [
|
|
36
|
+
"QString via QJsonValue::toString() at integration; std::string passthrough here for generator tests without Qt."
|
|
37
|
+
]),
|
|
38
|
+
`inline std::string ${CPP_FN}(const std::string& wire) {`,
|
|
39
|
+
" return wire;",
|
|
40
|
+
"}"
|
|
41
|
+
].join("\n");
|
|
42
|
+
}
|
|
43
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* AnQstGen base-type codec emitter for `AnQst.Type.string`.
|
|
4
|
+
* Wire form is a native JSON string (no base93). See RefinedSpecs/Codecs/String_string_Codec.md.
|
|
5
|
+
* Integration codegen maps the C++ domain type to QString / QJsonValue; standalone C++ snippets here use std::string so unit tests compile without Qt.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.encoder = exports.descriptor = void 0;
|
|
9
|
+
const comments_1 = require("../shared/comments");
|
|
10
|
+
exports.descriptor = {
|
|
11
|
+
codecId: "string",
|
|
12
|
+
specPath: "RefinedSpecs/Codecs/String_string_Codec.md",
|
|
13
|
+
tsType: "string",
|
|
14
|
+
cppType: "QString",
|
|
15
|
+
wireCategory: "string",
|
|
16
|
+
strategySummary: "Native JSON string; leaf identity encode/decode; no base93."
|
|
17
|
+
};
|
|
18
|
+
const TS_FN = "encodeAnqstBase_string";
|
|
19
|
+
const CPP_FN = "encodeAnqstBase_string";
|
|
20
|
+
exports.encoder = {
|
|
21
|
+
descriptor: exports.descriptor,
|
|
22
|
+
emitTsEncoder() {
|
|
23
|
+
return [
|
|
24
|
+
(0, comments_1.emitStrategyComment)("AnQst string encoder (identity)", [
|
|
25
|
+
"Emits the domain string unchanged for placement in JSON (native string on the wire).",
|
|
26
|
+
"No base93; JSON serializers handle escaping of quotes, backslashes, and controls."
|
|
27
|
+
]),
|
|
28
|
+
`function ${TS_FN}(value) {`,
|
|
29
|
+
" return value;",
|
|
30
|
+
"}"
|
|
31
|
+
].join("\n");
|
|
32
|
+
},
|
|
33
|
+
emitCppEncoder() {
|
|
34
|
+
return [
|
|
35
|
+
(0, comments_1.emitStrategyComment)("AnQst string encoder (identity, portable stub)", [
|
|
36
|
+
"QString / QJsonValue(value) at widget integration; std::string here for generator tests without Qt."
|
|
37
|
+
]),
|
|
38
|
+
`inline std::string ${CPP_FN}(const std::string& value) {`,
|
|
39
|
+
" return value;",
|
|
40
|
+
"}"
|
|
41
|
+
].join("\n");
|
|
42
|
+
}
|
|
43
|
+
};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Base codec emitter: AnQst.Type.stringArray — TypeScript/C++ decoder (standalone wire → string[] / QStringList).
|
|
4
|
+
*
|
|
5
|
+
* Standalone: if the payload is a string, it must decode to count 0 (empty array). If it is an array, the first
|
|
6
|
+
* element is the positional base93 count; the next count elements are the string values.
|
|
7
|
+
*
|
|
8
|
+
* Composite decoding is performed by the structured top-level codec: it reads the array length from blob
|
|
9
|
+
* metadata, then consumes that many consecutive strings from the flat collection (String_stringArray_Codec.md §5).
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.decoderEmitter = exports.descriptor = void 0;
|
|
13
|
+
exports.descriptor = {
|
|
14
|
+
codecId: "stringArray",
|
|
15
|
+
specPath: "RefinedSpecs/Codecs/String_stringArray_Codec.md",
|
|
16
|
+
tsType: "string[]",
|
|
17
|
+
cppType: "QStringList",
|
|
18
|
+
wireCategory: "string-array",
|
|
19
|
+
strategySummary: "Standalone: decode first item as positional base93 count, then read that many native strings; string-only payload implies count 0. Composite: length from byte blob; strings from shared collection (structured layer)."
|
|
20
|
+
};
|
|
21
|
+
const TS_FN = "decodeStringArrayStandalone";
|
|
22
|
+
const CPP_FN = "decodeStringArrayStandalone";
|
|
23
|
+
exports.decoderEmitter = {
|
|
24
|
+
descriptor: exports.descriptor,
|
|
25
|
+
emitTsDecoder() {
|
|
26
|
+
return `function ${TS_FN}(payload) {
|
|
27
|
+
if (typeof payload === "string") {
|
|
28
|
+
var n0 = decodeBase93Count(payload);
|
|
29
|
+
if (n0 !== 0) {
|
|
30
|
+
throw new Error("stringArray standalone: string payload must encode count 0");
|
|
31
|
+
}
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
if (!Array.isArray(payload)) {
|
|
35
|
+
throw new Error("stringArray standalone: expected JSON string or array");
|
|
36
|
+
}
|
|
37
|
+
if (payload.length < 2) {
|
|
38
|
+
throw new Error("stringArray standalone: array payload too short");
|
|
39
|
+
}
|
|
40
|
+
var n = decodeBase93Count(String(payload[0]));
|
|
41
|
+
if (payload.length !== n + 1) {
|
|
42
|
+
throw new Error("stringArray standalone: count does not match array tail");
|
|
43
|
+
}
|
|
44
|
+
var out = new Array(n);
|
|
45
|
+
for (var i = 0; i < n; i++) {
|
|
46
|
+
var el = payload[i + 1];
|
|
47
|
+
out[i] = el == null ? "" : String(el);
|
|
48
|
+
}
|
|
49
|
+
return out;
|
|
50
|
+
}`;
|
|
51
|
+
},
|
|
52
|
+
emitCppDecoder() {
|
|
53
|
+
return `inline QStringList ${CPP_FN}(const QJsonValue& payload) {
|
|
54
|
+
if (payload.isString()) {
|
|
55
|
+
const std::uint32_t n = decodeBase93Count(payload.toString().toStdString());
|
|
56
|
+
if (n != 0u) {
|
|
57
|
+
throw std::runtime_error("stringArray standalone: string payload must encode count 0");
|
|
58
|
+
}
|
|
59
|
+
return QStringList();
|
|
60
|
+
}
|
|
61
|
+
if (!payload.isArray()) {
|
|
62
|
+
throw std::runtime_error("stringArray standalone: expected JSON string or array");
|
|
63
|
+
}
|
|
64
|
+
const QJsonArray arr = payload.toArray();
|
|
65
|
+
if (arr.size() < 2) {
|
|
66
|
+
throw std::runtime_error("stringArray standalone: array payload too short");
|
|
67
|
+
}
|
|
68
|
+
const std::uint32_t n = decodeBase93Count(arr.at(0).toString().toStdString());
|
|
69
|
+
if (arr.size() != static_cast<int>(n) + 1) {
|
|
70
|
+
throw std::runtime_error("stringArray standalone: count does not match array tail");
|
|
71
|
+
}
|
|
72
|
+
QStringList out;
|
|
73
|
+
out.reserve(static_cast<int>(n));
|
|
74
|
+
for (std::uint32_t i = 0; i < n; ++i) {
|
|
75
|
+
out.append(arr.at(static_cast<int>(i + 1)).toString());
|
|
76
|
+
}
|
|
77
|
+
return out;
|
|
78
|
+
}`;
|
|
79
|
+
}
|
|
80
|
+
};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Base codec emitter: AnQst.Type.stringArray — TypeScript/C++ encoder (string[] / QStringList → standalone wire).
|
|
4
|
+
*
|
|
5
|
+
* Standalone: positional base93 element count as the first emission item, then native JSON string elements.
|
|
6
|
+
* Empty array: the count alone is emitted as a single string (best-case emission).
|
|
7
|
+
* Non-empty: a flat JSON array [count, ...elements] (length N+1 ≥ 2).
|
|
8
|
+
*
|
|
9
|
+
* Composite (structured top-level codec): string elements merge into the shared flat string collection; the
|
|
10
|
+
* element count is stored as fixed-width unsigned metadata (e.g. uint32) inside the byte blob, not as a
|
|
11
|
+
* separate base93 count string. See Structured_TopLevelCodec_Strategy.md §3.2 and String_stringArray_Codec.md §5.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.encoderEmitter = exports.descriptor = void 0;
|
|
15
|
+
exports.descriptor = {
|
|
16
|
+
codecId: "stringArray",
|
|
17
|
+
specPath: "RefinedSpecs/Codecs/String_stringArray_Codec.md",
|
|
18
|
+
tsType: "string[]",
|
|
19
|
+
cppType: "QStringList",
|
|
20
|
+
wireCategory: "string-array",
|
|
21
|
+
strategySummary: "Standalone: prepend positional base93 count string, then emit each element as a native JSON string; empty → single count string. Composite: count in byte blob as fixed-width uint; elements in shared string collection (orchestrated by structured layer)."
|
|
22
|
+
};
|
|
23
|
+
const TS_FN = "encodeStringArrayStandalone";
|
|
24
|
+
const CPP_FN = "encodeStringArrayStandalone";
|
|
25
|
+
exports.encoderEmitter = {
|
|
26
|
+
descriptor: exports.descriptor,
|
|
27
|
+
emitTsEncoder() {
|
|
28
|
+
return `function ${TS_FN}(value) {
|
|
29
|
+
var n = value.length;
|
|
30
|
+
var countStr = encodeBase93Count(n);
|
|
31
|
+
if (n === 0) {
|
|
32
|
+
return countStr;
|
|
33
|
+
}
|
|
34
|
+
var out = new Array(n + 1);
|
|
35
|
+
out[0] = countStr;
|
|
36
|
+
for (var i = 0; i < n; i++) {
|
|
37
|
+
out[i + 1] = value[i];
|
|
38
|
+
}
|
|
39
|
+
return out;
|
|
40
|
+
}`;
|
|
41
|
+
},
|
|
42
|
+
emitCppEncoder() {
|
|
43
|
+
return `inline QJsonValue ${CPP_FN}(const QStringList& value) {
|
|
44
|
+
const std::uint32_t n = static_cast<std::uint32_t>(value.size());
|
|
45
|
+
const QString countStr = QString::fromStdString(encodeBase93Count(n));
|
|
46
|
+
if (n == 0u) {
|
|
47
|
+
return QJsonValue(countStr);
|
|
48
|
+
}
|
|
49
|
+
QJsonArray arr;
|
|
50
|
+
arr.append(countStr);
|
|
51
|
+
for (const QString& s : value) {
|
|
52
|
+
arr.append(QJsonValue(s));
|
|
53
|
+
}
|
|
54
|
+
return QJsonValue(arr);
|
|
55
|
+
}`;
|
|
56
|
+
}
|
|
57
|
+
};
|