@@ -718,24 +718,10 @@ private final class WebSocketHandler(I) {
718
718
alias outparams = refOutParameterIndices! method;
719
719
alias paramnames = ParameterIdentifierTuple! method;
720
720
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);
728
722
729
723
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);
739
725
740
726
alias RT = typeof (__traits(getMember, impl, __traits(identifier, method))(args));
741
727
static if (! is (RT == void )) {
@@ -756,20 +742,46 @@ private final class WebSocketHandler(I) {
756
742
return bret;
757
743
}
758
744
759
- private auto resolveImpl (string qualified_name, RI )(RI base)
745
+ private auto resolveImpl (string qualified_name, RI )(RI base, Bson arguments )
760
746
if (is (RI == interface ))
761
747
{
762
748
import std.string : indexOf;
763
749
enum idx = qualified_name.indexOf(' .' );
764
750
static if (idx < 0 ) return base;
765
751
else {
766
752
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
+
767
758
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 );
769
760
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 );
771
762
}
772
763
}
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
+ }
773
785
}
774
786
775
787
0 commit comments