+our @ah = ();
+our @ac = ();
+our @missing = ();
+
+# Mapping of return type sequences to eclient callbacks
+our @eclient_return = (
+ ["no_response" => []],
+ ["string_response" => ["string"]],
+ ["string_response" => ["string-raw"]],
+ ["integer_response" => ["integer"]],
+ ["integer_response" => ["boolean"]],
+ ["time_response" => ["time"]],
+ ["pair_integer_response" => ["integer", "integer"]],
+ ["queue_response" => ["queue"]],
+ ["queue_response" => ["queue-one"]],
+ ["list_response" => ["body"]],
+ );
+
+# eclient_response_matces(RETURNS, VARIANT)
+#
+# Return true if VARIANT matches RETURNS
+sub eclient_response_matches {
+ my $returns = shift;
+ my $variant = shift;
+ my $types = $variant->[1];
+ if(scalar @$returns != scalar @$types) { return 0; }
+ for my $n (0 .. $#$returns) {
+ my $return = $returns->[$n];
+ my $type = $return->[0];
+ if($type ne $types->[$n]) { return 0; }
+ }
+ return 1;
+}
+
+# find_eclient_type(RETURNS)
+#
+# Find the result type for an eclient call
+sub find_eclient_response {
+ my $returns = shift;
+ if(!defined $returns) {
+ $returns = [];
+ }
+ for my $variant (@eclient_return) {
+ if(eclient_response_matches($returns, $variant)) {
+ return $variant->[0];
+ }
+ }
+ return undef;
+}