Skip to content

Commit 9a0626c

Browse files
authored
feat(arguments): enum argument (#354)
1 parent a580e96 commit 9a0626c

File tree

5 files changed

+48
-0
lines changed

5 files changed

+48
-0
lines changed

src/arguments/CoreEnum.ts

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import type { PieceContext } from '@sapphire/pieces';
2+
import { resolveEnum } from '../lib/resolvers';
3+
import { Argument } from '../lib/structures/Argument';
4+
5+
export class CoreArgument extends Argument<string> {
6+
public constructor(context: PieceContext) {
7+
super(context, { name: 'enum' });
8+
}
9+
10+
public run(
11+
parameter: string,
12+
context: { readonly enum?: string[]; readonly caseInsensitive?: boolean } & Argument.Context
13+
): Argument.Result<string> {
14+
const resolved = resolveEnum(parameter, { enum: context.enum, caseInsensitive: context.caseInsensitive });
15+
if (resolved.success) return this.ok(resolved.value);
16+
return this.error({
17+
parameter,
18+
identifier: resolved.error,
19+
message: `The argument must have one of the following values: ${context.enum?.join(', ')}`,
20+
context
21+
});
22+
}
23+
}

src/lib/errors/Identifiers.ts

+2
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ export const enum Identifiers {
3737
ArgumentStringTooLong = 'stringTooLong',
3838
ArgumentStringTooShort = 'stringTooShort',
3939
ArgumentUserError = 'userError',
40+
ArgumentEnumEmptyError = 'enumEmptyError',
41+
ArgumentEnumError = 'enumError',
4042

4143
CommandDisabled = 'commandDisabled',
4244

src/lib/parsers/Args.ts

+1
Original file line numberDiff line numberDiff line change
@@ -709,6 +709,7 @@ export interface ArgType {
709709
string: string;
710710
url: URL;
711711
user: User;
712+
enum: string;
712713
}
713714

714715
export interface ArgOptions extends Omit<Argument.Context, 'message' | 'command'> {}

src/lib/resolvers/enum.ts

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { Identifiers } from '../errors/Identifiers';
2+
import { err, ok, Result } from '../parsers/Result';
3+
4+
export function resolveEnum(
5+
parameter: string,
6+
options?: { enum?: string[]; caseInsensitive?: boolean }
7+
): Result<string, Identifiers.ArgumentEnumEmptyError | Identifiers.ArgumentEnumError> {
8+
if (!options?.enum?.length) {
9+
return err(Identifiers.ArgumentEnumEmptyError);
10+
}
11+
12+
if (!options.caseInsensitive && !options.enum.includes(parameter)) {
13+
return err(Identifiers.ArgumentEnumError);
14+
}
15+
16+
if (options.caseInsensitive && !options.enum.some((v) => v.toLowerCase() === parameter.toLowerCase())) {
17+
return err(Identifiers.ArgumentEnumError);
18+
}
19+
20+
return ok(parameter);
21+
}

src/lib/resolvers/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,4 @@ export * from './partialDMChannel';
2222
export * from './role';
2323
export * from './string';
2424
export * from './user';
25+
export * from './enum';

0 commit comments

Comments
 (0)