Initial Commit
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user