swift-argument-parser icon indicating copy to clipboard operation
swift-argument-parser copied to clipboard

Support passing a negative number as an argument

Open alexito4 opened this issue 4 years ago • 6 comments

Imagine a command like this

import ArgumentParser

struct Absolute: ParsableCommand {
    
    @Argument() var number: Int
    
    func run() throws {
        print(abs(number))
    }
}

Absolute.main()

you can run

command 5

and it works. but running

command -5

fails with Error: Missing expected argument '<number>' which makes sense.

I would have expected being able to pass the argument as "-5" but that doesn't work either.

Any advice on how to handle this?

alexito4 avatar Mar 01 '20 15:03 alexito4

We don't have a workaround for this right now. For an option, you can specify the .unconditional parsing strategy, but arguments don't provide that capability. The changes in #29 will make it possible to add support for this, though.

natecook1000 avatar Mar 02 '20 19:03 natecook1000

This seems a common issue with CLI apps. ls -5 gives error ls: illegal option -- 5. The solution there is ls -- -5. That solution seems to also work for SAP v 0.1.0.

fizker avatar Jun 13 '20 13:06 fizker

@fizker That's not quite true. ls does support -1 as value for arguments. Consider for example

$ ls -D -1 -la /var/empty/
total 0
drwxr-xr-x   2 root  sys      64 -1 .
drwxr-xr-x  36 root  wheel  1152 -1 ..

-D just selects the date/time format in the long (-l) output. And as you can see, it lists -1 as the time.

weissi avatar Mar 20 '23 15:03 weissi

@weissi I think you are confusing values for arguments with arguments. In your example, [-D format] is the argument you are triggering, not -D followed by -1. The parser can easily handle that case, because it is expecting (and indeed requiring) a value after -D, and thus will not attempt to parse it as an argument. Similarly, ls -D -l will not display the date at all, because it never enables long format.

fizker avatar Mar 20 '23 15:03 fizker

@fizker oh shoot, you're right. Sorry I thought this issue is about allowing negative numbers as values for arguments (like -D -1) but actually it's about negative numbers as arguments themselves (like ping -6).

weissi avatar Mar 20 '23 15:03 weissi

@weissi No problem, it happens to everyone :). You are correct though in that ls has an argument -1:

     -1      (The numeric digit “one”.) Force output to be one entry per line.  This is the default when output is not to a terminal. ```

`ls` only fails for unknown arguments unless they are succeeding `--`

fizker avatar Mar 21 '23 10:03 fizker