package restx.endpoint.mappers;
import com.fasterxml.jackson.databind.type.SimpleType;
import com.google.common.base.Optional;
import restx.RestxRequest;
import restx.RestxRequestMatch;
import restx.converters.MainStringConverter;
import restx.endpoint.EndpointParamDef;
import restx.endpoint.EndpointParameterKind;
import restx.factory.Component;
import java.lang.reflect.Type;
/**
* @author fcamblor
*/
@Component
public class BaseTypeEndpointParameterMapper implements EndpointParameterMapper {
final MainStringConverter converter;
public BaseTypeEndpointParameterMapper(MainStringConverter converter) {
this.converter = converter;
}
@Override
public <T> T mapRequest(
EndpointParamDef endpointParamDef,
RestxRequest request,
RestxRequestMatch match, EndpointParameterKind parameterKind) {
Optional<String> queryParamStrValue = parameterKind.extractQueryParamStringedValueFor(endpointParamDef, request, match);
return convertRequestParamValue(queryParamStrValue, endpointParamDef.getType(), endpointParamDef.getRawType());
}
public <T> T convertRequestParamValue(Optional<String> queryParamStrValue, Type paramType, Class paramRawType) {
if(String.class == paramType) {
return (T) queryParamStrValue.orNull();
} else {
if(queryParamStrValue.isPresent()) {
return (T) converter.convert(queryParamStrValue.get(), paramRawType);
} else {
return null;
}
}
}
public boolean isBaseTypeParam(EndpointParamDef endpointParamDef) {
return converter.canDeserialize(SimpleType.construct(endpointParamDef.getRawType()));
}
}