From b3ff589aa5837e2d60a9fbf27e8d738e490cacd3 Mon Sep 17 00:00:00 2001 From: hypercross Date: Mon, 6 Apr 2026 11:07:11 +0800 Subject: [PATCH] refactor: api changes --- src/core/game.ts | 2 +- src/samples/boop/commands.ts | 6 ++---- src/samples/tic-tac-toe.ts | 4 +--- src/utils/command/command-registry.ts | 8 ++++---- src/utils/command/command-runner.ts | 4 ++-- 5 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/core/game.ts b/src/core/game.ts index 1818fab..978c902 100644 --- a/src/core/game.ts +++ b/src/core/game.ts @@ -15,7 +15,7 @@ export interface IGameContext = {} > { produceAsync(fn: (draft: TState) => void): Promise; run(input: string): Promise>; runParsed(command: Command): Promise>; - prompt(schema: CommandSchema | string, validator: PromptValidator, currentPlayer?: string | null): Promise; + prompt: (schema: CommandSchema | string, validator: PromptValidator, currentPlayer?: string | null) => Promise; addInterruption(promise: Promise): void; // test only diff --git a/src/samples/boop/commands.ts b/src/samples/boop/commands.ts index 6410e6a..4402c34 100644 --- a/src/samples/boop/commands.ts +++ b/src/samples/boop/commands.ts @@ -187,8 +187,7 @@ async function handleCheckFullBoard(game: BoopGame, turnPlayer: PlayerType){ const partId = await game.prompt( 'choose ', - (command) => { - const [player, row, col] = command.params as [PlayerType, number, number]; + (player: PlayerType, row: number, col: number) => { if (player !== turnPlayer) { throw `Invalid player: ${player}. Expected ${turnPlayer}.`; } @@ -220,8 +219,7 @@ const checkFullBoard = registry.register({ async function handleTurn(game: BoopGame, turnPlayer: PlayerType) { const {row, col, type} = await game.prompt( 'play [type:string]', - (command) => { - const [player, row, col, type] = command.params as [PlayerType, number, number, PieceType?]; + (player: PlayerType, row: number, col: number, type?: PieceType) => { const pieceType = type === 'cat' ? 'cat' : 'kitten'; if (player !== turnPlayer) { diff --git a/src/samples/tic-tac-toe.ts b/src/samples/tic-tac-toe.ts index e46342f..c1673af 100644 --- a/src/samples/tic-tac-toe.ts +++ b/src/samples/tic-tac-toe.ts @@ -60,9 +60,7 @@ const turn = registry.register({ async run(game: TicTacToeGame, turnPlayer: PlayerType, turnNumber: number) { const {player, row, col} = await game.prompt( 'play ', - (command) => { - const [player, row, col] = command.params as [PlayerType, number, number]; - + (player: string, row: number, col: number) => { if (player !== turnPlayer) { throw `Invalid player: ${player}. Expected ${turnPlayer}.`; } else if (!isValidMove(row, col)) { diff --git a/src/utils/command/command-registry.ts b/src/utils/command/command-registry.ts index 4f8a774..ec8f385 100644 --- a/src/utils/command/command-registry.ts +++ b/src/utils/command/command-registry.ts @@ -147,11 +147,11 @@ export function createCommandRunnerContext( } }; - const prompt = ( + const prompt = ( schema: CommandSchema | string, - validator: PromptValidator, + validator: PromptValidator, currentPlayer?: string | null - ): Promise => { + ): Promise => { const resolvedSchema = typeof schema === 'string' ? parseCommandSchema(schema) : schema; return new Promise((resolve, reject) => { const tryCommit = (commandOrInput: Command | string) => { @@ -161,7 +161,7 @@ export function createCommandRunnerContext( return schemaResult.errors.join('; '); } try{ - const result = validator(schemaResult.command); + const result = validator(...schemaResult.command.params as TArgs); resolve(result); return null; }catch(e){ diff --git a/src/utils/command/command-runner.ts b/src/utils/command/command-runner.ts index c45c500..130e9e6 100644 --- a/src/utils/command/command-runner.ts +++ b/src/utils/command/command-runner.ts @@ -31,13 +31,13 @@ export type CommandResult = { error: string; } -export type PromptValidator = (command: Command) => T; +export type PromptValidator = (...params: TArgs) => TResult; export type CommandRunnerContext = { context: TContext; run: (input: string) => Promise>; runParsed: (command: Command) => Promise>; - prompt: (schema: CommandSchema | string, validator: PromptValidator, currentPlayer?: string | null) => Promise; + prompt: (schema: CommandSchema | string, validator: PromptValidator, currentPlayer?: string | null) => Promise; on: (event: T, listener: (e: CommandRunnerEvents[T]) => void) => void; off: (event: T, listener: (e: CommandRunnerEvents[T]) => void) => void; };