groovy-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Peter McNeil <pe...@mcneils.net>
Subject Re: Strategy for optionally excluding a named method parameter?
Date Mon, 27 Apr 2020 00:42:47 GMT
G'day David

On 25/4/20 6:17 am, David Karr wrote:
> Lately my only Groovy work is scripted pipelines in Jenkins, version 
> 2.89.4 .
>
> I'm working with an api that is somewhat dumb in one respect.  The 
> method we call takes ~25 parameters.  We send them as named 
> parameters. One of the parameters is of boolean type.  What we've 
> discovered from testing is that if we send a value as either "true" or 
> "false", it acts as if we sent "true".  If we construct the call 
> without that parameter entirely, it acts as if we sent "false".

The function could be making a truthyness mistake or you could be. e.g. 
if you called the function with "false" instead of false

groovy> def foo(Map args) {
groovy>     println "b1 = ${args.b1}"
groovy>     println "b2 = ${args.b2}"
groovy>     println "b3 = ${args.b3}"
groovy>     if (args.b1) {
groovy>         println "b1 tests true"
groovy>     } else {
groovy>         println "b1 tests false"
groovy>     }
groovy> }
groovy> foo(b2: true, b1: "false", b3: false)

b1 = false
b2 = true
b3 = false
b1 tests true


> I tried making it send null, but that just causes it to fail at 
> runtime.  We presently have an "if" for that one flag, with two calls 
> to the method, one taking 25 parameters, the other taking 24.  It is 
> really obnoxious.
you could clean up (DRY up) the code by adding the params to a map then 
just removing the parameter if that's the only way to make it work.
>
> Obviously, the proper fix is to change their api so that it works 
> correctly.  The reality is, that's not going to happen any time soon 
> in geological terms.
>
> Is there a concise groovy syntax we could use that would optionally 
> include or exclude a single parameter to the method?

yes:

Map args = [p1: true, p2: false, p3: true ...]

if(!p4) args.remove("p4")

foo(args)

Cheers,

Peter.


-- 
web: http://nerderg.com, twitter: http://twitter.com/pmcneil

Mime
View raw message