38 lines
1.0 KiB
TypeScript
38 lines
1.0 KiB
TypeScript
import type {
|
|
BitPackerSchema,
|
|
PackingContext,
|
|
PackingStrategy,
|
|
} from "@suaveplan/bitpacker";
|
|
import { isOptionalSchema } from "@suaveplan/bitpacker";
|
|
|
|
export class OptionalPackingStrategy implements PackingStrategy {
|
|
canHandle(schema: BitPackerSchema): boolean {
|
|
return isOptionalSchema(schema);
|
|
}
|
|
|
|
pack(
|
|
data: unknown,
|
|
schema: BitPackerSchema,
|
|
context: PackingContext
|
|
): void {
|
|
const { _optional: inner } = schema as { _optional: BitPackerSchema };
|
|
|
|
const present = data !== undefined && data !== null;
|
|
context.writer.writeBool(present);
|
|
|
|
if (present) {
|
|
context.packValue(data, inner);
|
|
}
|
|
}
|
|
|
|
unpack(schema: BitPackerSchema, context: PackingContext): unknown {
|
|
const { _optional: inner } = schema as { _optional: BitPackerSchema };
|
|
|
|
const present = context.reader.readBool();
|
|
if (!present) {
|
|
return undefined;
|
|
}
|
|
return context.unpackValue(inner);
|
|
}
|
|
}
|