Improved typing

This commit is contained in:
2026-02-19 17:20:51 +01:00
parent 1a4647b0f9
commit 5421a1ff16
4 changed files with 42 additions and 17 deletions
@@ -3,6 +3,7 @@ package dev.selimaj.session;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import dev.selimaj.session.types.Message; import dev.selimaj.session.types.Message;
import dev.selimaj.session.types.Method;
import java.net.URI; import java.net.URI;
import java.net.http.HttpClient; import java.net.http.HttpClient;
@@ -46,11 +47,10 @@ public final class Session {
listener.notify(ws, method, data); listener.notify(ws, method, data);
} }
public <Req, Res> CompletableFuture<Res> request( <Req extends JsonNode, Res extends JsonNode, Err extends JsonNode> CompletableFuture<Res> request(
String method, Class<? extends Method<Req, Res, Err>> method, Req req) throws Exception {
Req data, Method<Req, Res, Err> m = method.getDeclaredConstructor().newInstance();
Class<Res> resType) throws Exception { return listener.request(ws, m.getName(), req, m.getResClass());
return listener.request(ws, method, data, resType);
} }
public void close() throws Exception { public void close() throws Exception {
@@ -2,6 +2,32 @@ package dev.selimaj.session.types;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
public interface Method<Req extends JsonNode, Res extends JsonNode, Err extends JsonNode> { public class Method<Req extends JsonNode, Res extends JsonNode, Err extends JsonNode> {
String getName(); private final String name;
} private final Class<Req> reqClass;
private final Class<Res> resClass;
private final Class<Err> errClass;
protected Method(String name, Class<Req> reqClass, Class<Res> resClass, Class<Err> errClass) {
this.name = name;
this.reqClass = reqClass;
this.resClass = resClass;
this.errClass = errClass;
}
public String getName() {
return name;
}
public Class<Req> getReqClass() {
return reqClass;
}
public Class<Res> getResClass() {
return resClass;
}
public Class<Err> getErrClass() {
return errClass;
}
}
@@ -5,14 +5,9 @@ import com.fasterxml.jackson.databind.node.TextNode;
import dev.selimaj.session.types.Method; import dev.selimaj.session.types.Method;
public class Methods { public class Methods {
public static class Data implements Method<TextNode, TextNode, TextNode> { public static class Data extends Method<TextNode, TextNode, TextNode> {
@Override Data() {
public String getName() { super("data", TextNode.class, TextNode.class, TextNode.class);
return "data";
}
public static String getNameStatic() {
return "data";
} }
} }
} }
@@ -2,15 +2,19 @@ package dev.selimaj.session;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import com.fasterxml.jackson.databind.node.TextNode;
public class SessionTest { public class SessionTest {
static void testRequest() throws Exception { static void testRequest() throws Exception {
Session session = Session.connect("ws://localhost:8080/"); Session session = Session.connect("ws://localhost:8080/");
String response = session.request(Methods.Data.getNameStatic(), "Hello from client", String.class).get(); TextNode response = session.request(Methods.Data.class, TextNode.valueOf("Hello from client")).get();
System.out.println(response); System.out.println(response);
Thread.sleep(1000); Thread.sleep(1000);
session.close();
} }
@Test @Test