11/* eslint-disable @typescript-eslint/naming-convention */
22
33import type { ParsedArgs } from "../types.js" ;
4+ import { getDefaultArguments } from "./getDefaultArguments.js" ;
45
5- export const KNOWN_ARGUMENTS = [ "--help" , "--version" , "--check" ] as const ;
6+ export const KNOWN_FLAG_ARGUMENTS = [
7+ "--help" ,
8+ "--version" ,
9+ "--check" ,
10+ "--indent-tabs" ,
11+ ] as const ;
612
7- type KnownArgument = ( typeof KNOWN_ARGUMENTS ) [ number ] ;
8- type ArgHandler = ( parsedArgs : ParsedArgs ) => void ;
13+ export const KNOWN_VALUE_ARGUMENTS = [
14+ "--indent-width" ,
15+ "--line-width" ,
16+ "--column-width" ,
17+ ] as const ;
918
10- const ARG_HANDLERS : Record < KnownArgument , ArgHandler > = {
19+ type FlagArg = ( typeof KNOWN_FLAG_ARGUMENTS ) [ number ] ;
20+ type ValueArg = ( typeof KNOWN_VALUE_ARGUMENTS ) [ number ] ;
21+ type KnownArg = FlagArg | ValueArg ;
22+
23+ type FlagHandler = ( parsedArgs : ParsedArgs ) => void ;
24+
25+ type ValueHandler = (
26+ parsedArgs : ParsedArgs ,
27+ argName : KnownArg ,
28+ value : string ,
29+ ) => void ;
30+
31+ const FLAG_ARG_HANDLERS : Record < FlagArg , FlagHandler > = {
1132 "--help" : ( parsedArgs ) => {
1233 parsedArgs . help = true ;
1334 } ,
@@ -17,15 +38,25 @@ const ARG_HANDLERS: Record<KnownArgument, ArgHandler> = {
1738 "--check" : ( parsedArgs ) => {
1839 parsedArgs . check = true ;
1940 } ,
41+ "--indent-tabs" : ( parsedArgs ) => {
42+ parsedArgs . indentTabs = true ;
43+ } ,
44+ } ;
45+
46+ const VALUE_ARG_HANDLERS : Record < ValueArg , ValueHandler > = {
47+ "--indent-width" : ( parsedArgs , argName , value ) => {
48+ parsedArgs . indentWidth = parsePositiveInteger ( argName , value ) ;
49+ } ,
50+ "--line-width" : ( parsedArgs , argName , value ) => {
51+ parsedArgs . lineWidth = parsePositiveInteger ( argName , value ) ;
52+ } ,
53+ "--column-width" : ( parsedArgs , argName , value ) => {
54+ parsedArgs . columnWidth = parsePositiveInteger ( argName , value ) ;
55+ } ,
2056} ;
2157
2258export function parseArgs ( argv : string [ ] ) : ParsedArgs {
23- const result : ParsedArgs = {
24- filePatterns : [ ] ,
25- help : false ,
26- version : false ,
27- check : false ,
28- } ;
59+ const result = getDefaultArguments ( ) ;
2960
3061 for ( let i = 0 ; i < argv . length ; i ++ ) {
3162 const arg = argv [ i ] ;
@@ -36,10 +67,22 @@ export function parseArgs(argv: string[]): ParsedArgs {
3667 break ;
3768 }
3869
39- const handler = ARG_HANDLERS [ arg as KnownArgument ] ;
70+ const flagHandler = FLAG_ARG_HANDLERS [ arg as FlagArg ] ;
4071
41- if ( handler != null ) {
42- handler ( result ) ;
72+ if ( flagHandler != null ) {
73+ flagHandler ( result ) ;
74+ continue ;
75+ }
76+
77+ const valueHandler = VALUE_ARG_HANDLERS [ arg as ValueArg ] ;
78+
79+ if ( valueHandler != null ) {
80+ const value = argv [ i + 1 ] ;
81+ if ( value == null ) {
82+ throw new Error ( `Missing value for argument: ${ arg } ` ) ;
83+ }
84+ valueHandler ( result , arg as ValueArg , value ) ;
85+ i ++ ;
4386 continue ;
4487 }
4588
@@ -52,3 +95,13 @@ export function parseArgs(argv: string[]): ParsedArgs {
5295
5396 return result ;
5497}
98+
99+ function parsePositiveInteger ( argName : KnownArg , value : string ) : number {
100+ const parsed = Number . parseInt ( value , 10 ) ;
101+
102+ if ( ! Number . isInteger ( parsed ) || parsed <= 0 ) {
103+ throw new Error ( `Invalid value for ${ argName } : ${ value } ` ) ;
104+ }
105+
106+ return parsed ;
107+ }
0 commit comments