@@ -26,6 +26,8 @@ import { modern } from "jsr:@vim-fall/std@^0.8.0/builtin/coordinator/modern";
26
26
import { MODERN_THEME } from "jsr:@vim-fall/std@^0.8.0/builtin/theme/modern" ;
27
27
import { fzf } from "jsr:@vim-fall/std@^0.8.0/builtin/matcher/fzf" ;
28
28
29
+ import { ExpectedError } from "./error.ts" ;
30
+
29
31
const defaultCustomUrl = new URL (
30
32
"./_assets/default.custom.ts" ,
31
33
import . meta. url ,
@@ -238,18 +240,29 @@ function reset(): void {
238
240
pickerParamsMap . clear ( ) ;
239
241
}
240
242
241
- function buildContext ( denops : Denops ) {
242
- // TODO: Validation must be provided in fall.vim itself
243
+ function buildContext ( denops : Denops ) : {
244
+ denops : Denops ;
245
+ refineSetting : ReturnType < typeof buildRefineSetting > ;
246
+ refineActionPicker : ReturnType < typeof buildRefineActionPicker > ;
247
+ definePickerFromSource : ReturnType < typeof buildDefinePickerFromSource > ;
248
+ definePickerFromCurator : ReturnType < typeof buildDefinePickerFromCurator > ;
249
+ } {
250
+ const definePickerFromSource = buildDefinePickerFromSource ( pickerParamsMap ) ;
251
+ const definePickerFromCurator = buildDefinePickerFromCurator ( pickerParamsMap ) ;
243
252
return {
244
253
denops,
245
254
refineSetting : buildRefineSetting ( setting ) ,
246
255
refineActionPicker : buildRefineActionPicker ( actionPickerParams ) ,
247
- definePickerFromSource : buildDefinePickerFromSource (
248
- pickerParamsMap ,
249
- ) ,
250
- definePickerFromCurator : buildDefinePickerFromCurator (
251
- pickerParamsMap ,
252
- ) ,
256
+ definePickerFromSource : ( name , source , params ) => {
257
+ validatePickerName ( name ) ;
258
+ validateActions ( params . actions ) ;
259
+ return definePickerFromSource ( name , source , params ) ;
260
+ } ,
261
+ definePickerFromCurator : ( name , curator , params ) => {
262
+ validatePickerName ( name ) ;
263
+ validateActions ( params . actions ) ;
264
+ return definePickerFromCurator ( name , curator , params ) ;
265
+ } ,
253
266
} ;
254
267
}
255
268
@@ -264,4 +277,21 @@ async function getUserCustomUrl(denops: Denops): Promise<URL> {
264
277
}
265
278
}
266
279
280
+ function validatePickerName ( name : string ) : void {
281
+ if ( pickerParamsMap . has ( name ) ) {
282
+ throw new ExpectedError ( `Picker '${ name } ' is already defined.` ) ;
283
+ }
284
+ if ( name . startsWith ( "@" ) ) {
285
+ throw new ExpectedError ( `Picker name must not start with '@': ${ name } ` ) ;
286
+ }
287
+ }
288
+
289
+ function validateActions ( actions : Record < PropertyKey , unknown > ) : void {
290
+ Object . keys ( actions ) . forEach ( ( name ) => {
291
+ if ( name . startsWith ( "@" ) ) {
292
+ throw new ExpectedError ( `Action name must not start with '@': ${ name } ` ) ;
293
+ }
294
+ } ) ;
295
+ }
296
+
267
297
export type { ActionPickerParams , PickerParams , Setting } ;
0 commit comments