package org.zwobble.mammoth.tests; import org.zwobble.mammoth.internal.util.Iterables; import java.util.Iterator; import static java.util.Arrays.asList; public class Arguments { // TODO: make sure all arguments are used private final Object[] arguments; public Arguments(Object[] arguments) { this.arguments = arguments; } public T get(Class clazz) { return only(getAll(clazz)); } public T get(Class clazz, T defaultValue) { return onlyOrDefault(getAll(clazz), defaultValue); } public T get(ArgumentKey key, T defaultValue) { return onlyOrDefault(getAll(key), defaultValue); } private Iterable getAll(Class clazz) { return Iterables.lazyFilter(asList(arguments), clazz); } private Iterable getAll(ArgumentKey key) { return Iterables.lazyMap( Iterables.lazyFilter( Iterables.lazyFilter(asList(arguments), Argument.class), argument -> argument.getKey().equals(key) ), argument -> (T)argument.getValue() ); } private T onlyOrDefault(Iterable iterable, T defaultValue) { return onlyOrDefault(iterable.iterator(), defaultValue); } private T onlyOrDefault(Iterator iterator, T defaultValue) { if (!iterator.hasNext()) { return defaultValue; } else { return only(iterator); } } private T only(Iterable iterable) { return only(iterable.iterator()); } private T only(Iterator iterator) { T value = iterator.next(); if (iterator.hasNext()) { throw new RuntimeException("Expected exactly one element, but had multiple elements"); } else { return value; } } }