refactor: just throw Error if fail

This commit is contained in:
hypercross 2026-04-04 23:42:49 +08:00
parent b929a126a1
commit dd73deabb0
3 changed files with 9 additions and 9 deletions

View File

@ -90,7 +90,7 @@ const boopCommand = registry.register('boop <row:number> <col:number> <type>', b
/** /**
* (线) * (线)
*/ */
async function checkWin(game: BoopGame) { async function checkWin(game: BoopGame): Promise<WinnerType | null> {
for(const line of getLineCandidates()){ for(const line of getLineCandidates()){
let whites = 0; let whites = 0;
let blacks = 0; let blacks = 0;
@ -151,10 +151,9 @@ async function setup(game: BoopGame) {
while (true) { while (true) {
const currentPlayer = game.value.currentPlayer; const currentPlayer = game.value.currentPlayer;
const turnOutput = await turnCommand(game, currentPlayer); const turnOutput = await turnCommand(game, currentPlayer);
if (!turnOutput.success) throw new Error(turnOutput.error);
await game.produceAsync(state => { await game.produceAsync(state => {
state.winner = turnOutput.result.winner; state.winner = turnOutput.winner;
if (!state.winner) { if (!state.winner) {
state.currentPlayer = state.currentPlayer === 'white' ? 'black' : 'white'; state.currentPlayer = state.currentPlayer === 'white' ? 'black' : 'white';
} }
@ -233,7 +232,7 @@ async function turn(game: BoopGame, turnPlayer: PlayerType) {
await placeCommand(game, row, col, turnPlayer, pieceType); await placeCommand(game, row, col, turnPlayer, pieceType);
await boopCommand(game, row, col, pieceType); await boopCommand(game, row, col, pieceType);
const winner = await checkWinCommand(game); const winner = await checkWinCommand(game);
if(winner.success) return { winner: winner.result as WinnerType }; if(winner) return { winner: winner };
await checkGraduatesCommand(game); await checkGraduatesCommand(game);
await checkFullBoard(game, turnPlayer); await checkFullBoard(game, turnPlayer);

View File

@ -42,10 +42,9 @@ async function setup(game: TicTacToeGame) {
const currentPlayer = game.value.currentPlayer; const currentPlayer = game.value.currentPlayer;
const turnNumber = game.value.turn + 1; const turnNumber = game.value.turn + 1;
const turnOutput = await turnCommand(game, currentPlayer, turnNumber); const turnOutput = await turnCommand(game, currentPlayer, turnNumber);
if (!turnOutput.success) throw new Error(turnOutput.error);
game.produce(state => { game.produce(state => {
state.winner = turnOutput.result.winner; state.winner = turnOutput.winner;
if (!state.winner) { if (!state.winner) {
state.currentPlayer = state.currentPlayer === 'X' ? 'O' : 'X'; state.currentPlayer = state.currentPlayer === 'X' ? 'O' : 'X';
state.turn = turnNumber; state.turn = turnNumber;

View File

@ -30,13 +30,15 @@ export class CommandRegistry<TContext> extends Map<string, CommandRunner<TContex
type TParams = TFunc extends (ctx: TContext, ...args: infer X) => Promise<unknown> ? X : null; type TParams = TFunc extends (ctx: TContext, ...args: infer X) => Promise<unknown> ? X : null;
type TResult = TFunc extends (ctx: TContext, ...args: any[]) => Promise<infer X> ? X : null; type TResult = TFunc extends (ctx: TContext, ...args: any[]) => Promise<infer X> ? X : null;
return function(ctx: TContext & CanRunParsed, ...args: TParams){ return async function(ctx: TContext & CanRunParsed, ...args: TParams){
return ctx.runParsed({ const result: CommandResult<TResult> = await ctx.runParsed({
options: {}, options: {},
params: args, params: args,
flags: {}, flags: {},
name: parsedSchema.name, name: parsedSchema.name,
}) as Promise<CommandResult<TResult>>; });
if(result.success) return result.result;
throw new Error(result.error);
} }
} }
} }