Skip to content

Commit 7f5c8f3

Browse files
authored
Merge pull request #2798 from vibe-d/webrpc
Enable Collection!T getters with arguments in the RPC module
2 parents 471ab85 + ac29ef4 commit 7f5c8f3

File tree

1 file changed

+31
-19
lines changed

1 file changed

+31
-19
lines changed

web/vibe/web/rpc.d

+31-19
Original file line numberDiff line numberDiff line change
@@ -718,24 +718,10 @@ private final class WebSocketHandler(I) {
718718
alias outparams = refOutParameterIndices!method;
719719
alias paramnames = ParameterIdentifierTuple!method;
720720

721-
SI impl = resolveImpl!qualified_name(m_impl);
722-
723-
static if (isAuthenticated!(SI, method)) {
724-
typeof(handleAuthentication!method(impl, m_peerInfo)) auth_info;
725-
726-
auth_info = handleAuthentication!method(impl, m_peerInfo);
727-
}
721+
SI impl = resolveImpl!qualified_name(m_impl, arguments);
728722

729723
ParameterTypeTuple!method args;
730-
foreach (i, name; paramnames) {
731-
static if (is(typeof(args[i]) == AuthInfo!SI))
732-
args[i] = auth_info;
733-
else static if (!(ParameterStorageClassTuple!method[i] & ParameterStorageClass.out_))
734-
args[i] = deserializeBson!(typeof(args[i]))(arguments[name]);
735-
}
736-
737-
static if (isAuthenticated!(SI, method))
738-
handleAuthorization!(SI, method, args)(auth_info);
724+
resolveArguments!method(impl, arguments, args);
739725

740726
alias RT = typeof(__traits(getMember, impl, __traits(identifier, method))(args));
741727
static if (!is(RT == void)) {
@@ -756,20 +742,46 @@ private final class WebSocketHandler(I) {
756742
return bret;
757743
}
758744

759-
private auto resolveImpl(string qualified_name, RI)(RI base)
745+
private auto resolveImpl(string qualified_name, RI)(RI base, Bson arguments)
760746
if (is(RI == interface))
761747
{
762748
import std.string : indexOf;
763749
enum idx = qualified_name.indexOf('.');
764750
static if (idx < 0) return base;
765751
else {
766752
enum mname = qualified_name[0 .. idx];
753+
alias method = __traits(getMember, base, mname);
754+
755+
ParameterTypeTuple!method args;
756+
resolveArguments!method(base, arguments, args);
757+
767758
static if (isInstanceOf!(Collection, ReturnType!(__traits(getMember, base, mname))))
768-
return resolveImpl!(qualified_name[idx+1 .. $])(__traits(getMember, base, mname).m_interface);
759+
return resolveImpl!(qualified_name[idx+1 .. $])(__traits(getMember, base, mname)(args).m_interface, arguments);
769760
else
770-
return resolveImpl!(qualified_name[idx+1 .. $])(__traits(getMember, base, mname));
761+
return resolveImpl!(qualified_name[idx+1 .. $])(__traits(getMember, base, mname)(args), arguments);
771762
}
772763
}
764+
765+
private void resolveArguments(alias method, SI)(SI impl, Bson arguments, out typeof(ParameterTypeTuple!method.init) args)
766+
{
767+
alias paramnames = ParameterIdentifierTuple!method;
768+
769+
static if (isAuthenticated!(SI, method)) {
770+
typeof(handleAuthentication!method(impl, m_peerInfo)) auth_info;
771+
772+
auth_info = handleAuthentication!method(impl, m_peerInfo);
773+
}
774+
775+
foreach (i, name; paramnames) {
776+
static if (is(typeof(args[i]) == AuthInfo!SI))
777+
args[i] = auth_info;
778+
else static if (!(ParameterStorageClassTuple!method[i] & ParameterStorageClass.out_))
779+
args[i] = deserializeBson!(typeof(args[i]))(arguments[name]);
780+
}
781+
782+
static if (isAuthenticated!(SI, method))
783+
handleAuthorization!(SI, method, args)(auth_info);
784+
}
773785
}
774786

775787

0 commit comments

Comments
 (0)