Skip to content

Commit cf5338f

Browse files
committed
Add convenience method for copying out dsl arguments
1 parent e38c6f5 commit cf5338f

File tree

7 files changed

+171
-2
lines changed

7 files changed

+171
-2
lines changed

src/main/java/com/lmax/simpledsl/api/DslParams.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,14 @@ public interface DslParams extends DslValues
5252
*/
5353
RepeatingGroup[] valuesAsGroup(String groupName);
5454

55+
/**
56+
* Create a new {@literal array} of arguments that can be re-parsed into a new instance of {@link DslParams}.
57+
*
58+
* @param args the name of the arguments to copy
59+
* @return the new {@literal array} of parameters
60+
*/
61+
String[] copyArgs(String... args);
62+
5563
/**
5664
* Create new {@link DslParams}.
5765
*
@@ -64,7 +72,6 @@ static DslParams create(String[] args, DslArg... arguments)
6472
return new DslParamsParser().parse(args, arguments);
6573
}
6674

67-
6875
/**
6976
* A shorthand way to create a {@link DslParams} instance that accepts a single required parameter and return the
7077
* value that was supplied for that parameter.
@@ -79,5 +86,4 @@ static String getSingleRequiredParamValue(final String[] args, final String requ
7986
.parse(args, new RequiredArg(requiredParamName))
8087
.value(requiredParamName);
8188
}
82-
8389
}

src/main/java/com/lmax/simpledsl/internal/DslParam.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,6 @@ abstract class DslParam
2525
abstract RepeatingParamGroup asRepeatingParamGroup();
2626

2727
abstract boolean hasValue();
28+
29+
abstract String[] rawArgs();
2830
}

src/main/java/com/lmax/simpledsl/internal/DslParamsImpl.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,13 @@
1919
import com.lmax.simpledsl.api.DslParams;
2020
import com.lmax.simpledsl.api.RepeatingGroup;
2121

22+
import java.util.HashSet;
2223
import java.util.Map;
2324
import java.util.Optional;
25+
import java.util.Set;
26+
27+
import static java.util.Arrays.asList;
28+
import static java.util.Arrays.stream;
2429

2530
/**
2631
* The internal implementation of {@link DslParams}.
@@ -58,6 +63,18 @@ public RepeatingGroup[] valuesAsGroup(final String groupName)
5863
return repeatingParamGroup.values();
5964
}
6065

66+
@Override
67+
public String[] copyArgs(final String... argsToCopy)
68+
{
69+
final Set<String> uniqueArgsToCopy = new HashSet<>(asList(argsToCopy));
70+
return stream(args)
71+
.map(DslArg::getName)
72+
.filter(uniqueArgsToCopy::contains)
73+
.map(this::getDslParam)
74+
.flatMap(param -> stream(param.rawArgs()))
75+
.toArray(String[]::new);
76+
}
77+
6178
@Override
6279
public boolean hasValue(final String name)
6380
{

src/main/java/com/lmax/simpledsl/internal/RepeatingParamGroup.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020

2121
import java.util.List;
2222

23+
import static java.util.Arrays.stream;
24+
2325
class RepeatingParamGroup extends DslParam
2426
{
2527
private final String name;
@@ -64,4 +66,12 @@ public boolean hasValue()
6466
{
6567
return !values.isEmpty();
6668
}
69+
70+
@Override
71+
String[] rawArgs()
72+
{
73+
return values.stream()
74+
.flatMap(val -> stream(val.rawArgs()))
75+
.toArray(String[]::new);
76+
}
6777
}

src/main/java/com/lmax/simpledsl/internal/RepeatingParamValues.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import java.util.List;
77
import java.util.Map;
88

9+
import static java.util.Arrays.stream;
10+
911
class RepeatingParamValues implements RepeatingGroup
1012
{
1113
private final DslArg[] dslArgs;
@@ -47,4 +49,12 @@ private List<String> getValues(final String name)
4749
{
4850
return name != null ? valuesByName.get(name.toLowerCase()) : null;
4951
}
52+
53+
public String[] rawArgs()
54+
{
55+
return stream(dslArgs)
56+
.flatMap(arg -> getValues(arg.getName()).stream()
57+
.map(val -> arg.getName() + ": " + val))
58+
.toArray(String[]::new);
59+
}
5060
}

src/main/java/com/lmax/simpledsl/internal/SimpleDslParam.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,12 @@ boolean hasValue()
5353
return !values.isEmpty();
5454
}
5555

56+
@Override
57+
String[] rawArgs()
58+
{
59+
return values.stream().map(val -> name + ": " + val).toArray(String[]::new);
60+
}
61+
5662
/**
5763
* Get the value for this parameter. If multiple values are allowed, use {@link #getValues()} instead.
5864
*

src/test/java/com/lmax/simpledsl/internal/DslParamsImplTest.java

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,15 @@
1717

1818
import com.lmax.simpledsl.api.DslArg;
1919
import com.lmax.simpledsl.api.DslParams;
20+
import com.lmax.simpledsl.api.OptionalArg;
21+
import com.lmax.simpledsl.api.RepeatingArgGroup;
22+
import com.lmax.simpledsl.api.RequiredArg;
2023
import org.junit.jupiter.api.Test;
2124

2225
import java.math.BigDecimal;
2326
import java.util.Collections;
2427
import java.util.HashMap;
28+
import java.util.List;
2529
import java.util.Map;
2630
import java.util.Optional;
2731

@@ -263,4 +267,118 @@ public void shouldReturnOptionalListWhenMultipleParameterValueIsSupplied()
263267

264268
assertEquals(Optional.of(asList("value1", "value2")), params.valuesAsOptional("a"));
265269
}
270+
271+
@Test
272+
public void shouldCopyArguments()
273+
{
274+
final DslArg[] args = {new RequiredArg("a"), new RequiredArg("b"), new RequiredArg("c")};
275+
276+
final SimpleDslParam aParam = new SimpleDslParam("a", asList("value1", "value2"));
277+
final SimpleDslParam bParam = new SimpleDslParam("b", singletonList("value3"));
278+
final SimpleDslParam cParam = new SimpleDslParam("c", singletonList("value4"));
279+
280+
final Map<String, DslParam> rawParams = new HashMap<>();
281+
rawParams.put("a", aParam);
282+
rawParams.put("b", bParam);
283+
rawParams.put("c", cParam);
284+
285+
final DslParams params = new DslParamsImpl(args, rawParams);
286+
287+
assertArrayEquals(new String[]{"a: value1", "a: value2", "b: value3"}, params.copyArgs("a", "b"));
288+
}
289+
290+
@Test
291+
public void shouldCopyArgumentWhenOptionalArgumentWasNotSupplied()
292+
{
293+
final DslArg[] args = {new RequiredArg("a"), new RequiredArg("b"), new OptionalArg("c")};
294+
295+
final SimpleDslParam aParam = new SimpleDslParam("a", asList("value1", "value2"));
296+
final SimpleDslParam bParam = new SimpleDslParam("b", singletonList("value3"));
297+
final SimpleDslParam cParam = new SimpleDslParam("c", emptyList());
298+
299+
final Map<String, DslParam> rawParams = new HashMap<>();
300+
rawParams.put("a", aParam);
301+
rawParams.put("b", bParam);
302+
rawParams.put("c", cParam);
303+
304+
final DslParams params = new DslParamsImpl(args, rawParams);
305+
306+
assertArrayEquals(new String[]{"a: value1", "a: value2"}, params.copyArgs("a", "c"));
307+
}
308+
309+
@Test
310+
public void shouldCopyArgumentIncludingARepeatingGroup()
311+
{
312+
final RequiredArg groupArg = new RequiredArg("c");
313+
final DslArg[] args = {
314+
new RequiredArg("a"),
315+
new RequiredArg("b"),
316+
new RepeatingArgGroup(groupArg)
317+
};
318+
319+
final SimpleDslParam aParam = new SimpleDslParam("a", asList("value1", "value2"));
320+
final SimpleDslParam bParam = new SimpleDslParam("b", singletonList("value3"));
321+
final RepeatingParamGroup gParam = new RepeatingParamGroup("c", singletonList(
322+
new RepeatingParamValues(new DslArg[]{groupArg}, Collections.singletonMap("c", singletonList("value3")))
323+
));
324+
325+
final Map<String, DslParam> rawParams = new HashMap<>();
326+
rawParams.put("a", aParam);
327+
rawParams.put("b", bParam);
328+
rawParams.put("c", gParam);
329+
330+
final DslParams params = new DslParamsImpl(args, rawParams);
331+
332+
assertArrayEquals(new String[]{"a: value1", "a: value2", "c: value3"}, params.copyArgs("a", "c"));
333+
}
334+
335+
@Test
336+
public void shouldCopyArgumentIncludingARepeatingGroupWithMultipleArguments()
337+
{
338+
final RequiredArg groupArg = new RequiredArg("c");
339+
final RequiredArg otherGroupArg = new RequiredArg("d");
340+
final DslArg[] args = {
341+
new RequiredArg("a"),
342+
new RequiredArg("b"),
343+
new RepeatingArgGroup(groupArg, otherGroupArg)
344+
};
345+
346+
final SimpleDslParam aParam = new SimpleDslParam("a", asList("value1", "value2"));
347+
final SimpleDslParam bParam = new SimpleDslParam("b", singletonList("value3"));
348+
349+
final Map<String, List<String>> rawGroupParams = new HashMap<>();
350+
rawGroupParams.put("c", singletonList("value3"));
351+
rawGroupParams.put("d", asList("value4", "value5"));
352+
final RepeatingParamGroup gParam = new RepeatingParamGroup("c", singletonList(
353+
new RepeatingParamValues(new DslArg[]{groupArg, otherGroupArg}, rawGroupParams)
354+
));
355+
356+
final Map<String, DslParam> rawParams = new HashMap<>();
357+
rawParams.put("a", aParam);
358+
rawParams.put("b", bParam);
359+
rawParams.put("c", gParam);
360+
361+
final DslParams params = new DslParamsImpl(args, rawParams);
362+
363+
assertArrayEquals(new String[]{"a: value1", "a: value2", "c: value3", "d: value4", "d: value5"}, params.copyArgs("a", "c"));
364+
}
365+
366+
@Test
367+
public void shouldCopyArgumentsOnlyOnceEvenIfSpecifiedMultipleTimes()
368+
{
369+
final DslArg[] args = {new RequiredArg("a"), new RequiredArg("b"), new RequiredArg("c")};
370+
371+
final SimpleDslParam aParam = new SimpleDslParam("a", asList("value1", "value2"));
372+
final SimpleDslParam bParam = new SimpleDslParam("b", singletonList("value3"));
373+
final SimpleDslParam cParam = new SimpleDslParam("c", emptyList());
374+
375+
final Map<String, DslParam> rawParams = new HashMap<>();
376+
rawParams.put("a", aParam);
377+
rawParams.put("b", bParam);
378+
rawParams.put("c", cParam);
379+
380+
final DslParams params = new DslParamsImpl(args, rawParams);
381+
382+
assertArrayEquals(new String[]{"a: value1", "a: value2"}, params.copyArgs("a", "a", "a"));
383+
}
266384
}

0 commit comments

Comments
 (0)