package org.smoothbuild.builtin.file.match.testing;
import static java.util.Arrays.asList;
import static org.smoothbuild.builtin.file.match.Constants.SINGLE_STAR;
import static org.smoothbuild.builtin.file.match.NamePattern.namePattern;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
public class MatchingNamesGenerator {
public static void generateNames(String pattern, Consumer<String> consumer) {
List<List<String>> template = createGeneratorTemplate(pattern);
generateNames("", template, 0, consumer);
}
private static void generateNames(String name, List<List<String>> template, int index,
Consumer<String> consumer) {
if (index == template.size()) {
consumer.accept(name);
} else {
for (String elem : template.get(index)) {
generateNames(name + elem, template, index + 1, consumer);
}
}
}
private static List<List<String>> createGeneratorTemplate(String pattern) {
List<List<String>> result = new ArrayList<>();
addNameGenerators(result, pattern);
return result;
}
private static void addNameGenerators(List<List<String>> result, String namePattern) {
if (namePattern.equals(SINGLE_STAR)) {
result.add(HelpTester.ALL);
}
List<String> parts = namePattern(namePattern).parts();
for (String part : parts) {
if (part.equals(SINGLE_STAR)) {
result.add(HelpTester.ALL_WITH_EMPTY);
} else {
result.add(asList(part));
}
}
}
}