@@ -130,6 +130,7 @@ def assert_flag(key, value)
130130 assert_string_or_array "#{ key } .default" , value [ 'default' ]
131131 assert_string_or_array "#{ key } .validate" , value [ 'validate' ]
132132
133+ assert_boolean "#{ key } .negatable" , value [ 'negatable' ]
133134 assert_boolean "#{ key } .private" , value [ 'private' ]
134135 assert_boolean "#{ key } .repeatable" , value [ 'repeatable' ]
135136 assert_boolean "#{ key } .unique" , value [ 'unique' ]
@@ -148,6 +149,13 @@ def assert_flag(key, value)
148149
149150 refute value [ 'required' ] && value [ 'default' ] , "#{ key } cannot have both nub`required` and nub`default`"
150151
152+ if value [ 'negatable' ]
153+ assert value [ 'long' ] , "#{ key } .negatable requires nub`long`"
154+ refute value [ 'arg' ] , "#{ key } .negatable does not make sense with nub`arg`"
155+ refute value [ 'repeatable' ] , "#{ key } .negatable does not make sense with nub`repeatable`"
156+ refute value [ 'required' ] , "#{ key } .negatable does not make sense with nub`required`"
157+ end
158+
151159 if value [ 'default' ]
152160 assert value [ 'arg' ] , "#{ key } .default does not make sense without nub`arg`"
153161 end
@@ -234,7 +242,7 @@ def assert_command(key, value)
234242 assert_array "#{ key } .variables" , value [ 'variables' ] , of : :var
235243
236244 assert_uniq "#{ key } .commands" , value [ 'commands' ] , %w[ name alias ]
237- assert_uniq " #{ key } .flags" , value [ 'flags' ] , %w[ long short alias ]
245+ assert_uniq_flags key , value [ 'flags' ]
238246 assert_uniq "#{ key } .args" , value [ 'args' ] , 'name'
239247
240248 if value [ 'function' ]
@@ -276,5 +284,23 @@ def assert_command(key, value)
276284 refute value [ 'extensible' ] , "#{ key } .extensible makes no sense"
277285 end
278286 end
287+
288+ def assert_uniq_flags ( key , flags )
289+ return unless flags
290+
291+ list = flags . flat_map do |flag |
292+ [ flag [ 'long' ] , flag [ 'short' ] , *Array ( flag [ 'alias' ] ) , negated_flag_name ( flag ) ] . compact
293+ end
294+
295+ nonuniqs = list . nonuniq
296+ assert nonuniqs . empty? ,
297+ "#{ key } .flags contains non-unique elements (#{ nonuniqs . join ', ' } ) in long or short or alias"
298+ end
299+
300+ def negated_flag_name ( flag )
301+ return unless flag [ 'negatable' ] == true && flag [ 'long' ]
302+
303+ "--no-#{ flag [ 'long' ] . delete_prefix '--' } "
304+ end
279305 end
280306end
0 commit comments