Pro zjednodušení tvoření příkazu a lepší přehlednost by bylo vhodné aby každý příkaz vracel generickou návratovou hodnotu typu Result<T>
. Typ Result<T>
bud obsahuje návratovou hodnotu T
nebo Error
. Lze se dotázat pomocí metody IsValid
zda je stav Success
, nebo pomocí metody IsInvalid
na stav Faulted
. Tedy typ je řízen dvěma stavy.
Stav Faulted
se navrací pomocí funkce Err
, která přijímá jeden argument, který má popisovat chybu.
https://github.com/Thomasparsley/inf-upol-disc/blob/057b6a2404bb0a9bd0f3d1e00fff07dbcd252397/bot/src/result.ts#L48
Ukázka použití funkce Err
/* Before */
const cmd = commands.get(cmdname);
if (!cmd) {
await ReplySilent("Příkaz není k dispozici");
return;
}
/* After */
const cmd = commands.get(cmdname);
if (!cmd) {
return Err("Příkaz není k dispozici");
}
Stav Success
se navrací pomocí funkce Ok
, která přijímá jeden argument typu T
.
https://github.com/Thomasparsley/inf-upol-disc/blob/057b6a2404bb0a9bd0f3d1e00fff07dbcd252397/bot/src/result.ts#L47
Prozatím jsem nevyřešil, co navracent do stavu Success
.
Návrh:
/* Before */
await replySilent(`Role ${role} byla **odebrána**.`);
/* After */
return Ok({type: silent, msg: `Role ${role} byla **odebrána**.`});
Bot by po vykonání funkce onInteractionCreate zpracoval návratovou hodnotu. Pokud by stav návratové hodnoty byl Faulted
s popisem chyby by se zavolala funkce ReplySilent
. Pokud by stav byl Success
podle typu by se provedlo zpracování.
EDIT:
Lepší použití stavu Success
/* Before */
await roles.add(StudentID);
await validation.remove();
await replySilent("Úspěšně jste se ověřil/a.");
return;
/* After */
return Ok([
roles.add(StudentID),
validation.remove(),
replySilent("Úspěšně jste se ověřil/a."),
]);