An opinionated molecule library which defines schema in code.
-
TypedArray
: Can I Use? -
DataView
: Can I Use? -
BigInt
: Can I Use?
The differences between @ckb-cobuild/molecule
and @ckb-lumos/codec
:
- Lumos is flexible on the parameter type of the
pack
function, this library is strict and providesparse
,safeParse
,around
to do conversions. - Lumos table codec fields are nullable, this library only allows null for option field.
- This library supports schema validation via
parse
andsafeParse
. - This library supports exporting molecule schema to
.mol
file.
This library prefers better type inferring and checking to sipmle schema definition. There will be many type names repetitions because of the limitation of TypeScript.
import { mol } from "@ckb-cobuild/molecule";
const ByteCoerce = mol.byte.beforeParse((input: any) => Number(input));
import { mol } from "@ckb-cobuild/molecule";
const ByteOpt = mol.option("ByteOpt", mol.byte);
const BooleanOpt = ByteOpt.around({
safeParse: (input: boolean | null) => mol.parseSuccess(input),
willPack: (input: boolean | null) =>
input !== null ? (input ? 1 : 0) : null,
didUnpack: (value: number | null) => (value !== null ? value !== 0 : null),
});
const result = codec.safeParse({/*...*/});
expect(result.success).toBeFalsy();
if (!result.success) {
const messages = result.error.collectMessages();
expect(messages).toEqual([
"//: Struct member parse failed",
"//a: Expected integer from 0 to 255, found undefined",
"//b: Array member parse failed",
"//b/0: Expected object, found null",
"//b/2: Struct member parse failed",
"//b/2/b2: Array member parse failed",
"//b/2/b2/1: Expected integer from 0 to 255, found -1",
]);
}
import { mol } from "@ckb-cobuild/molecule";
const ByteOpt = mol.option("ByteOpt", mol.byte);
const ByteOptOpt = mol.option("ByteOptOpt", ByteOpt);
export(Array.from(ByteOptOpt.exportSchema().values())).toEqual([
"option ByteOpt (byte);",
"option ByteOptOpt (ByteOpt);",
]);