// deno-lint-ignore-file no-explicit-any import { type AsyncResult, type Keyof, type Optional, TaggedError, } from "@fabric/core"; import type { StoreQueryError } from "../../errors/query-error.ts"; import type { FilterOptions } from "./filter-options.ts"; import type { OrderByOptions } from "./order-by-options.ts"; export interface StoreQuery { where(where: FilterOptions): StoreSortableQuery; orderBy(opts: OrderByOptions): StoreLimitableQuery; limit(limit: number, offset?: number): SelectableQuery; select(): AsyncResult; select>( keys: K[], ): AsyncResult[], StoreQueryError>; selectOne(): AsyncResult, StoreQueryError>; selectOne>( keys: K[], ): AsyncResult>, StoreQueryError>; selectOneOrFail(): AsyncResult; selectOneOrFail>( keys: K[], ): AsyncResult, StoreQueryError | NotFoundError>; } export interface StoreSortableQuery { orderBy(opts: OrderByOptions): StoreLimitableQuery; limit(limit: number, offset?: number): SelectableQuery; select(): AsyncResult; select>( keys: K[], ): AsyncResult[], StoreQueryError>; selectOne(): AsyncResult, StoreQueryError>; selectOne>( keys: K[], ): AsyncResult>, StoreQueryError>; selectOneOrFail(): AsyncResult; selectOneOrFail>( keys: K[], ): AsyncResult, StoreQueryError | NotFoundError>; } export interface StoreLimitableQuery { limit(limit: number, offset?: number): SelectableQuery; select(): AsyncResult; select>( keys: K[], ): AsyncResult[], StoreQueryError>; selectOne(): AsyncResult, StoreQueryError>; selectOne>( keys: K[], ): AsyncResult>, StoreQueryError>; selectOneOrFail(): AsyncResult; selectOneOrFail>( keys: K[], ): AsyncResult, StoreQueryError | NotFoundError>; } export interface SelectableQuery { select(): AsyncResult; select>( keys: K[], ): AsyncResult[], StoreQueryError>; selectOne(): AsyncResult, StoreQueryError>; selectOne>( keys: K[], ): AsyncResult>, StoreQueryError>; selectOneOrFail(): AsyncResult; selectOneOrFail>( keys: K[], ): AsyncResult, StoreQueryError | NotFoundError>; } export interface StoreQueryDefinition { from: K; where?: FilterOptions; orderBy?: OrderByOptions; limit?: number; offset?: number; keys?: string[]; } export class NotFoundError extends TaggedError<"NotFoundError"> { constructor() { super("NotFoundError"); } }