curl/trurl

Using `--iterate foo='bar baz'` and `--set foo='rab'` at the same time is not an error

emanuele6 opened this issue · 4 comments

Using duplicate --set components is an error:

$ trurl -s 'fragment=1' -s 'fragment=2' localhost
trurl error: duplicate --set for component fragment
trurl error: Try trurl -h for help

And using duplicate --iterate components is an error:

$ trurl --iterate 'fragment=1' --iterate 'fragment=2' localhost
trurl error: duplicate component for iterate: fragment
trurl error: Try trurl -h for help

But using the same component both with --set and --iterate is not an error:

$ trurl --iterate 'fragment=1 2' -s 'fragment=3' localhost
http://localhost/#1
http://localhost/#2

Here, first -s 'fragment=3' is applied and then --iterate 'fragment=1 2' overwrites it, so -s 'fragment=3' is just silently "ignored".

Should we reconsider and just use -s for even for iterations? If there's a space it means a list and then we iterate. It would make it clearer that iterate is just another version of set, and perhaps also simplify the code for tings like this.

Should we reconsider and just use -s for even for iterations

This makes sense

I would prefer that the -s/--set option just sets the specified component to the value given value without any special parsing/handling: no, \n/\t/etc expansion; no space splitting for iteration; etc.
E.g. trurl -s query='foo ba\nr' localhost should (as it does now) simply set the query to that value.

$ trurl -s query='foo ba\nr' localhost
http://localhost/?foo+ba%5cnr

Not output:

http://localhost/?foo
http://localhost/?ba%5cnr

or

http://localhost/?foo
http://localhost/?ba%0ar

If you want to allow multiple -s for the same component, and e.g. make -s host=example.org -s host=curl.se equivalent to --iterate 'host=example.org curl.se', I am not opposed to that.

I personally do find --iterate very useful, but, for users that want to be able to iterate multiple values for a component -s path=foo -s path=bar is probably better than --iterate 'path=foo bar' anyway, since with --iterate you cannot use a foo, or bar that contains spaces, but with -s you can.

Right. It does have its merits to keep them separate. I have a patch coming to fix this issue.