package com.github.dreamhead.moco.rest.builder;
import com.github.dreamhead.moco.HttpMethod;
import com.github.dreamhead.moco.RequestMatcher;
import com.github.dreamhead.moco.ResponseBase;
import com.github.dreamhead.moco.ResponseHandler;
import com.github.dreamhead.moco.RestIdMatcher;
import com.github.dreamhead.moco.RestSetting;
import com.github.dreamhead.moco.RestSettingBuilder;
import com.github.dreamhead.moco.internal.AbstractResponseBase;
import com.github.dreamhead.moco.rest.RestAllSetting;
import com.github.dreamhead.moco.rest.RestSingleSetting;
import com.google.common.base.Optional;
import static com.github.dreamhead.moco.handler.AndResponseHandler.and;
import static com.google.common.base.Preconditions.checkNotNull;
public abstract class RestSettingBuilders extends AbstractResponseBase<RestSetting>
implements RestSettingBuilder, ResponseBase<RestSetting> {
protected abstract RestSetting createSetting(final Optional<RequestMatcher> matcher, final ResponseHandler handler);
private RequestMatcher matcher;
@Override
public ResponseBase<RestSetting> request(final RequestMatcher matcher) {
this.matcher = checkNotNull(matcher, "Request matcher should not be null");
return this;
}
@Override
public RestSetting response(final ResponseHandler handler, final ResponseHandler... handlers) {
return createSetting(Optional.fromNullable(matcher),
and(checkNotNull(handler, "Response handler should not be null"),
checkNotNull(handlers, "Response handlers should not be null")));
}
public static RestSettingBuilder single(final HttpMethod method, final RestIdMatcher id) {
return new RestSettingBuilders() {
@Override
protected RestSetting createSetting(final Optional<RequestMatcher> matcher, final ResponseHandler handler) {
return new RestSingleSetting(method, id, matcher, handler);
}
};
}
public static RestSettingBuilder all(final HttpMethod method) {
return new RestSettingBuilders() {
@Override
protected RestSetting createSetting(final Optional<RequestMatcher> matcher, final ResponseHandler handler) {
return new RestAllSetting(method, matcher, handler);
}
};
}
}