import type { Envelope } from './envelope.ts' import type { Reason } from './reason.ts' type ResourceCommand = { type: string resource: TResource } type NoResourceCommand = object interface CommandMethodsProperties { get: NoResourceCommand set: ResourceCommand merge: ResourceCommand delete: NoResourceCommand | ResourceCommand observe: ResourceCommand } export type CommandMethods = keyof CommandMethodsProperties export type Command = Envelope & { uri: string method: TMethod } & CommandMethodsProperties[TMethod] export type UnknownCommand = Command export type CommandResponse< TResponse, TMethod extends CommandMethods, TStatus extends 'success' | 'failure', > = Envelope & { method: TMethod } & (TStatus extends 'success' ? { status: 'success' type?: string resource?: TResponse } : { status: 'failure' reason: Reason }) export type UnknownCommandResponse = CommandResponse export const isCommand = (envelope: Envelope): envelope is UnknownCommand => 'method' in envelope && 'uri' in envelope