1
1
from __future__ import annotations
2
2
3
3
import re
4
- from typing import TYPE_CHECKING , Any , Iterable
4
+ from typing import TYPE_CHECKING , Any , Iterable , Literal
5
5
6
6
from nepattern import ANY , STRING , AnyString , BasePattern
7
7
from tarina import Empty , lang , safe_eval , split_once
19
19
PauseTriggered ,
20
20
ParamsUnmatched ,
21
21
)
22
- from ..typing import KWBool , MultiVar , _AllParamPattern , _StrMulti
22
+ from ..typing import KWBool , _AllParamPattern
23
23
24
24
from ._util import levenshtein
25
25
@@ -74,12 +74,14 @@ def _validate(argv: Argv, target: Arg[Any], value: BasePattern[Any, Any, Any], r
74
74
result [target .name ] = res ._value # noqa
75
75
76
76
77
- def step_varpos (argv : Argv , args : _Args , slot : tuple [MultiVar , Arg ], result : dict [str , Any ]):
78
- value , arg = slot
77
+ def step_varpos (argv : Argv , args : _Args , slot : tuple [int | Literal ["+" , "*" , "str" ], Arg ], result : dict [str , Any ]):
78
+ flag , arg = slot
79
+ value = arg .type_
79
80
key = arg .name
81
+ length = int (flag ) if flag .__class__ is int else - 1
80
82
default_val = arg .field .default
81
83
_result = []
82
- kwonly_seps = "" .join ([arg .type_ . sep for arg in args .keyword_only .values ()]) # type: ignore
84
+ kwonly_seps = "" .join ([arg .field . kw_sep for arg in args .keyword_only .values ()])
83
85
count = 0
84
86
while argv .current_index != argv .ndata :
85
87
may_arg , _str = argv .next (arg .field .seps )
@@ -91,33 +93,36 @@ def step_varpos(argv: Argv, args: _Args, slot: tuple[MultiVar, Arg], result: dic
91
93
if _str and kwonly_seps and split_once (pat .match (may_arg )["name" ], kwonly_seps , argv .filter_crlf )[0 ] in args .keyword_only : # noqa: E501 # type: ignore
92
94
argv .rollback (may_arg )
93
95
break
94
- if _str and args .vars_keyword and "=" in may_arg : # args.vars_keyword[0][0].base.sep in may_arg:
96
+ if _str and args .vars_keyword and args .vars_keyword [0 ][0 ] in may_arg :
95
97
argv .rollback (may_arg )
96
98
break
97
- if (res := value .base . validate (may_arg )).flag != "valid" :
99
+ if (res := value .validate (may_arg )).flag != "valid" :
98
100
argv .rollback (may_arg )
99
101
break
100
102
_result .append (res ._value ) # noqa
101
103
count += 1
102
- if 0 < value . length <= count :
104
+ if 0 < length <= count :
103
105
break
104
106
if not _result :
105
107
if default_val is not Empty :
106
108
_result = default_val if isinstance (default_val , Iterable ) else ()
107
- elif value . flag == "*" :
109
+ elif flag == "*" :
108
110
_result = ()
109
111
elif arg .field .optional :
110
112
return
111
113
else :
112
114
raise ArgumentMissing (arg .field .get_missing_tips (lang .require ("args" , "missing" ).format (key = key )), arg )
113
- if isinstance ( value , _StrMulti ) :
115
+ if flag == "str" :
114
116
result [key ] = arg .field .seps [0 ].join (_result )
115
117
else :
116
118
result [key ] = tuple (_result )
117
119
118
120
119
- def step_varkey (argv : Argv , slot : tuple [MultiVar , Arg ], result : dict [str , Any ]):
120
- value , arg = slot
121
+ def step_varkey (argv : Argv , slot : tuple [str , Arg ], result : dict [str , Any ]):
122
+ kw_sep , arg = slot
123
+ flag = arg .field .multiple
124
+ length = int (flag ) if flag .__class__ is int else - 1
125
+ value = arg .type_
121
126
name = arg .name
122
127
default_val = arg .field .default
123
128
_result = {}
@@ -129,23 +134,23 @@ def step_varkey(argv: Argv, slot: tuple[MultiVar, Arg], result: dict[str, Any]):
129
134
break
130
135
if _str and may_arg in global_config .remainders :
131
136
break
132
- if not (_kwarg := re .match (rf"^(-*[^{ '=' } ]+){ '=' } (.*?)$" , may_arg )):
137
+ if not (_kwarg := re .match (rf"^(-*[^{ kw_sep } ]+){ kw_sep } (.*?)$" , may_arg )):
133
138
argv .rollback (may_arg )
134
139
break
135
140
key = _kwarg [1 ]
136
141
if not (_m_arg := _kwarg [2 ]):
137
142
_m_arg , _ = argv .next (arg .field .seps )
138
- if (res := value .base . validate (_m_arg )).flag != "valid" :
143
+ if (res := value .validate (_m_arg )).flag != "valid" :
139
144
argv .rollback (may_arg )
140
145
break
141
146
_result [key ] = res ._value # noqa
142
147
count += 1
143
- if 0 < value . length <= count :
148
+ if 0 < length <= count :
144
149
break
145
150
if not _result :
146
151
if default_val is not Empty :
147
152
_result = default_val if isinstance (default_val , dict ) else {}
148
- elif value . flag == "*" :
153
+ elif flag == "*" :
149
154
_result = {}
150
155
elif arg .field .optional :
151
156
return
@@ -158,8 +163,7 @@ def step_keyword(argv: Argv, args: _Args, result: dict[str, Any]):
158
163
kwonly_seps = set ()
159
164
for arg in args .keyword_only .values ():
160
165
kwonly_seps .update (arg .field .seps )
161
- # kwonly_seps1 = "".join([arg.type_.sep for arg in args.keyword_only.values()]) # type: ignore
162
- kwonly_seps1 = "="
166
+ kwonly_seps1 = "" .join ([arg .field .kw_sep for arg in args .keyword_only .values ()])
163
167
target = len (args .keyword_only )
164
168
count = 0
165
169
while count < target :
@@ -181,7 +185,7 @@ def step_keyword(argv: Argv, args: _Args, result: dict[str, Any]):
181
185
):
182
186
break
183
187
for arg in args .keyword_only .values ():
184
- if arg .type_ .validate (may_arg ).flag == "valid" : # type: ignore
188
+ if arg .type_ .validate (may_arg ).flag == "valid" :
185
189
raise InvalidParam (lang .require ("args" , "key_missing" ).format (target = may_arg , key = arg .name ), arg )
186
190
for name in args .keyword_only :
187
191
if levenshtein (_key , name ) >= argv .fuzzy_threshold :
@@ -193,7 +197,7 @@ def step_keyword(argv: Argv, args: _Args, result: dict[str, Any]):
193
197
if isinstance (value , KWBool ):
194
198
_m_arg = key
195
199
else :
196
- _m_arg , _ = argv .next ("=" ) # ( args.keyword_only[_key].separators)
200
+ _m_arg , _ = argv .next (args .keyword_only [_key ].separators )
197
201
_validate (argv , arg , value , result , _m_arg , _str )
198
202
count += 1
199
203
0 commit comments