flag: allow to check the count of the free args to produce an error
							parent
							
								
									43b81688f6
								
							
						
					
					
						commit
						ff730b4eb0
					
				| 
						 | 
				
			
			@ -62,11 +62,15 @@ pub mut:
 | 
			
		|||
  application_name        string
 | 
			
		||||
  application_version     string
 | 
			
		||||
  application_description string
 | 
			
		||||
 | 
			
		||||
  min_free_args int
 | 
			
		||||
  max_free_args int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// create a new flag set for parsing command line arguments
 | 
			
		||||
// TODO use INT_MAX some how
 | 
			
		||||
pub fn new_flag_parser(args []string) &FlagParser {
 | 
			
		||||
  return &FlagParser{args:args}
 | 
			
		||||
  return &FlagParser{args:args, max_free_args: 4048}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// change the application name to be used in 'usage' output
 | 
			
		||||
| 
						 | 
				
			
			@ -212,6 +216,17 @@ pub fn (fs mut FlagParser) string(n, v, u string) string {
 | 
			
		|||
  return parsed
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// add an additional check for free arguments 
 | 
			
		||||
// this will cause an error in finalize() if free args are out of range
 | 
			
		||||
// (min, ..., max)
 | 
			
		||||
pub fn (fs mut FlagParser) limit_free_args(min, max int) {
 | 
			
		||||
  if min > max {
 | 
			
		||||
    panic('flag.limit_free_args expect min < max, got $min >= $max')
 | 
			
		||||
  }
 | 
			
		||||
  fs.min_free_args = min
 | 
			
		||||
  fs.max_free_args = max
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
  // used for formating usage message
 | 
			
		||||
  SPACE = '                            '
 | 
			
		||||
| 
						 | 
				
			
			@ -259,5 +274,16 @@ pub fn (fs FlagParser) finalize() ?[]string {
 | 
			
		|||
      return error('Unknown argument \'${a.right(2)}\'')
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  if fs.args.len < fs.min_free_args {
 | 
			
		||||
    return error('Expect at least ${fs.min_free_args} arguments')
 | 
			
		||||
  }
 | 
			
		||||
  if fs.args.len >= fs.max_free_args {
 | 
			
		||||
    if fs.max_free_args > 0 {
 | 
			
		||||
      return error('Expect at most ${fs.max_free_args} arguments')
 | 
			
		||||
    } else {
 | 
			
		||||
      return error('Expect no arguments')
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return fs.args
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -191,3 +191,43 @@ fn test_if_no_options_given_usage_message_does_not_contain_options() {
 | 
			
		|||
  
 | 
			
		||||
  assert !fp.usage().contains('options:')
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_free_args_could_be_limited() {
 | 
			
		||||
  mut fp1 := flag.new_flag_parser(['a', 'b', 'c'])
 | 
			
		||||
  fp1.limit_free_args(1, 4)
 | 
			
		||||
  args := fp1.finalize() or {
 | 
			
		||||
    assert false
 | 
			
		||||
    return
 | 
			
		||||
  }
 | 
			
		||||
  assert args[0] == 'a' && args[1] == 'b' && args[2] == 'c'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_error_for_to_few_free_args() {
 | 
			
		||||
  mut fp1 := flag.new_flag_parser(['a', 'b', 'c'])
 | 
			
		||||
  fp1.limit_free_args(5, 6)
 | 
			
		||||
  args := fp1.finalize() or {
 | 
			
		||||
    assert err == 'Expect at least 5 arguments'
 | 
			
		||||
    return
 | 
			
		||||
  }
 | 
			
		||||
  assert args.len < 0 // expect an error and need to use args 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_error_for_to_much_free_args() {
 | 
			
		||||
  mut fp1 := flag.new_flag_parser(['a', 'b', 'c'])
 | 
			
		||||
  fp1.limit_free_args(1, 2)
 | 
			
		||||
  args := fp1.finalize() or {
 | 
			
		||||
    assert err == 'Expect at most 2 arguments'
 | 
			
		||||
    return
 | 
			
		||||
  }
 | 
			
		||||
  assert args.len < 0 // expect an error and need to use args 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_could_expect_no_free_args() {
 | 
			
		||||
  mut fp1 := flag.new_flag_parser(['a'])
 | 
			
		||||
  fp1.limit_free_args(0, 0)
 | 
			
		||||
  args := fp1.finalize() or {
 | 
			
		||||
    assert err == 'Expect no arguments'
 | 
			
		||||
    return
 | 
			
		||||
  }
 | 
			
		||||
  assert args.len < 0 // expect an error and need to use args 
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue