File tree 5 files changed +48
-0
lines changed
5 files changed +48
-0
lines changed Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change @@ -37,6 +37,8 @@ export const enum Identifiers {
37
37
ArgumentStringTooLong = 'stringTooLong' ,
38
38
ArgumentStringTooShort = 'stringTooShort' ,
39
39
ArgumentUserError = 'userError' ,
40
+ ArgumentEnumEmptyError = 'enumEmptyError' ,
41
+ ArgumentEnumError = 'enumError' ,
40
42
41
43
CommandDisabled = 'commandDisabled' ,
42
44
Original file line number Diff line number Diff line change @@ -709,6 +709,7 @@ export interface ArgType {
709
709
string : string ;
710
710
url : URL ;
711
711
user : User ;
712
+ enum : string ;
712
713
}
713
714
714
715
export interface ArgOptions extends Omit < Argument . Context , 'message' | 'command' > { }
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change @@ -22,3 +22,4 @@ export * from './partialDMChannel';
22
22
export * from './role' ;
23
23
export * from './string' ;
24
24
export * from './user' ;
25
+ export * from './enum' ;
You can’t perform that action at this time.
0 commit comments