+
+ // FIXME: This should be probably part of BindingRuntimeContext and RpcServices perhaps should have their own
+ // RuntimeType
+ private static ImmutableBiMap<Method, RpcRuntimeType> getRpcMethodToSchema(
+ final CurrentAdapterSerializer serializer, final Class<? extends RpcService> key) {
+ final var runtimeContext = serializer.getRuntimeContext();
+ final var types = runtimeContext.getTypes();
+ final var qnameModule = BindingReflections.getQNameModule(key);
+
+ // We are dancing a bit here to reconstruct things a RpcServiceRuntimeType could easily hold
+ final var module = runtimeContext.getEffectiveModelContext().findModuleStatement(qnameModule)
+ .orElseThrow(() -> new IllegalStateException("No module found for " + qnameModule + " service " + key));
+ return module.streamEffectiveSubstatements(RpcEffectiveStatement.class)
+ .map(rpc -> {
+ final var rpcName = rpc.argument();
+ final var inputClz = runtimeContext.getRpcInput(rpcName);
+ final var methodName = BindingMapping.getRpcMethodName(rpcName);
+
+ final Method method;
+ try {
+ method = key.getMethod(methodName, inputClz);
+ } catch (NoSuchMethodException e) {
+ throw new IllegalStateException("Cannot find RPC method for " + rpc, e);
+ }
+
+ final var type = types.schemaTreeChild(rpcName);
+ if (!(type instanceof RpcRuntimeType rpcType)) {
+ throw new IllegalStateException("Unexpected run-time type " + type + " for " + rpcName);
+ }
+ return Map.entry(method, rpcType);
+ })
+ .collect(ImmutableBiMap.toImmutableBiMap(Entry::getKey, Entry::getValue));
+ }