UNPKG

@tai-kun/surrealdb

Version:

The SurrealDB SDK for JavaScript

117 lines (100 loc) 2.72 kB
import { RangeBase as Base } from "@tai-kun/surrealdb/decodeonly-datatypes"; import { SurrealTypeError } from "@tai-kun/surrealdb/errors"; import { isBoundExcluded, isBoundIncluded } from "@tai-kun/surrealdb/utils"; import BoundExcluded from "./bound-excluded"; import BoundIncluded from "./bound-included"; import { CBOR_TAG_RANGE, type Encodable } from "./spec"; type BoundIncludedBase = new(source: any) => BoundIncluded; type BoundExcludedBase = new(source: any) => BoundExcluded; type Bound<TTypes extends RangeTypes> = | InstanceType<TTypes["BoundIncluded"]> | InstanceType<TTypes["BoundExcluded"]>; export type RangeTypes< TBoundIncluded extends BoundIncludedBase = BoundIncludedBase, TBoundExcluded extends BoundExcludedBase = BoundExcludedBase, > = { readonly BoundIncluded: TBoundIncluded; readonly BoundExcluded: TBoundExcluded; }; export type RangeSource<TTypes extends RangeTypes = RangeTypes> = readonly [ begin: Bound<TTypes> | null, end: Bound<TTypes> | null, ]; /** * @experimental */ export class RangeBase<TTypes extends RangeTypes = RangeTypes> extends Base<TTypes> implements Encodable { override toString(): string { let s = ""; if (isBoundExcluded(this.begin)) { s = ">"; } else if (!isBoundIncluded(this.begin) && this.begin !== null) { throw new SurrealTypeError( ["BoundIncluded", "BoundExcluded", "null"], this.begin, ); } if (this.begin) { s = this.begin.toString() + s; } s += ".."; if (isBoundIncluded(this.end)) { s += "="; } else if (!isBoundExcluded(this.end) && this.end !== null) { throw new SurrealTypeError( ["BoundIncluded", "BoundExcluded", "null"], this.end, ); } if (this.end) { s += this.end.toSurql(); } return s; } toCBOR(): [ tag: typeof CBOR_TAG_RANGE, value: [ begin: Bound<TTypes> | null, end: Bound<TTypes> | null, ], ] { return [ CBOR_TAG_RANGE, [ this.begin, this.end, ], ]; } toJSON(): string { return this.toString(); } toSurql(): string { return this.toString(); } toPlainObject(): { begin: Bound<TTypes> | null; end: Bound<TTypes> | null; } { return { begin: this.begin, end: this.end, }; } } /** * [API Reference](https://tai-kun.github.io/surrealdb.js/v2/api/data/range) * @experimental */ export class Range extends RangeBase<RangeTypes<typeof BoundIncluded, typeof BoundExcluded>> { static readonly BoundIncluded = BoundIncluded; static readonly BoundExcluded = BoundExcluded; constructor(source: RangeSource<typeof Range>) { super(source, Range); } }