@@ -165,7 +165,7 @@ default <T> T[] valuesAs(final String name, final Class<T> type, final Function<
165165 * <p>
166166 * Returns an empty {@link Stream} if the parameter is optional and a value has not been supplied.
167167 *
168- * @param name the name of the parameter.
168+ * @param name the name of the parameter.
169169 * @param enumType the {@link Enum} type.
170170 * @param <T> the {@link Enum} type.
171171 * @return a {@link Stream} of values supplied for the parameter.
@@ -330,6 +330,76 @@ default String valueAsParamNamed(final String oldParamName, final String newPara
330330 return value != null ? newParamName + ": " + value : null ;
331331 }
332332
333+ /**
334+ * Retrieve the value supplied for a parameter formatted as a parameter with multiple values. For example, if the parameter {@literal users} was given the value {@literal jenny, john},
335+ * then {@code valuesAsParam("user")} would return {@code user: jenny,john}. The delimiter takes whichever value is defined in the parameter definition.
336+ * <p>
337+ * This is useful when reusing DSL methods to build higher level functions. e.g.
338+ *
339+ * <pre>{@code
340+ * public void createUserAndLogin(String... args) {
341+ * DslParams params = new DslParams(args,
342+ * new RequiredParam("user"),
343+ * new RequiredParam("accountTypes").setAllowMultipleValues(";")
344+ * );
345+ * createUser(params.valueAsParam("user"), "password: password", params.valuesAsParam("accountTypes");
346+ * login(params.valueAsParam("user"), "password: password");
347+ * }
348+ * }</pre>
349+ *
350+ * @param name the name of the parameter.
351+ * @return the value supplied for that parameter, formatted as a parameter ready to pass on to another method that uses Simple-DSL.
352+ * @throws IllegalArgumentException if {@code name} does not match the name of a supported parameter.
353+ */
354+ default String valuesAsParam (final String name )
355+ {
356+ final String [] values = values (name );
357+ final String delimiter = stream (getParams ())
358+ .filter (arg -> arg .getName ().equals (name .toLowerCase ()))
359+ .findFirst ()
360+ .map (DslArg ::getMultipleValueSeparator )
361+ .orElseThrow (() -> new IllegalArgumentException (name + " is not a parameter" ));
362+
363+
364+ return values .length != 0 ? name + ": " + String .join (delimiter , values ) : null ;
365+ }
366+
367+ /**
368+ * Retrieve the value supplied for a parameter formatted as a parameter with the given name.
369+ * For example, if the parameter {@literal user} was given the values {@literal jenny, john}, then
370+ * {@code valuesAsParamNamed("user", "person")} would return {@code person: jenny,john}.
371+ * The delimiter takes whichever value is defined in the parameter definition.
372+ * <p>
373+ * This is useful when reusing DSL methods to build higher level functions. e.g.
374+ *
375+ * <pre>{@code
376+ * public void createUserAndLogin(String... args) {
377+ * DslParams params = new DslParams(args,
378+ * new RequiredParam("user"),
379+ * new RequiredParam("accountType").setAllowMultipleValues());
380+ * generateRandomUser(params.valueAsParamNamed("user", "rememberUserAs"), params.valuesAsParamNamed("accountType", "accounts");
381+ * login(params.valueAsParam("user"), "password: password");
382+ * }
383+ * }</pre>
384+ *
385+ * @param oldParamName the name of the parameter.
386+ * @param newParamName the new name of the parameter.
387+ * @return the value supplied for that parameter, formatted as a parameter ready to pass on to another method that uses Simple-DSL.
388+ * @throws IllegalArgumentException if {@code name} does not match the name of a supported parameter.
389+ */
390+ default String valuesAsParamNamed (final String oldParamName , final String newParamName )
391+ {
392+ final String [] values = values (oldParamName );
393+ final String delimiter = stream (getParams ())
394+ .filter (arg -> arg .getName ().equals (oldParamName .toLowerCase ()))
395+ .findFirst ()
396+ .map (DslArg ::getMultipleValueSeparator )
397+ .orElseThrow (() -> new IllegalArgumentException (oldParamName + " is not a parameter" ));
398+
399+
400+ return values .length != 0 ? newParamName + ": " + String .join (delimiter , values ) : null ;
401+ }
402+
333403 /**
334404 * Retrieve the values supplied for a parameter as a {@link List}. Returns an empty list if the parameter is optional and a value has not been supplied.
335405 *
0 commit comments