package io.muoncore.spring.mapping;
import io.muoncore.Muon;
import io.muoncore.protocol.requestresponse.server.HandlerPredicate;
import io.muoncore.protocol.requestresponse.server.RequestResponseServerHandlerApi;
import io.muoncore.protocol.requestresponse.server.ServerRequest;
import io.muoncore.protocol.requestresponse.server.ServerResponse;
import io.muoncore.spring.methodinvocation.MuonRequestMethodInvocation;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.function.Predicate;
public class MuonRequestListenerService {
@Autowired
private Muon muon;
public void addRequestMapping(String resource, final MuonRequestMethodInvocation methodInvocation) {
muon.handleRequest(resourcePredicate(resource), resourceHandler(methodInvocation));
}
private RequestResponseServerHandlerApi.Handler resourceHandler(MuonRequestMethodInvocation methodInvocation) {
return wrapper -> {
Object result = methodInvocation.invoke(wrapper);
final ServerResponse response = new ServerResponse(200, result);
wrapper.answer(response);
};
}
private HandlerPredicate resourcePredicate(String resource) {
return new HandlerPredicate() {
@Override
public String resourceString() {
return resource;
}
@Override
public Predicate<ServerRequest> matcher() {
return requestMetaData -> requestMetaData.getUrl().equals(resource);
}
};
}
}