Skip to content

Commit 6d717c9

Browse files
authored
Merge pull request #2763 from vibe-d/fix_rest_enums
Fix handling of enum parameters for REST interface clients
2 parents 98ee426 + 20ed67a commit 6d717c9

File tree

2 files changed

+36
-10
lines changed

2 files changed

+36
-10
lines changed

tests/rest/source/app.d

+19
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,12 @@ interface Example8API
483483
double d;
484484
}
485485

486+
enum E {
487+
foo = 0,
488+
bar = 1,
489+
baz = 0
490+
}
491+
486492
FooType constFoo (const FooType param);
487493
FooType constRefFoo (const ref FooType param);
488494
FooType inFoo (in FooType param);
@@ -491,6 +497,7 @@ interface Example8API
491497
int[] constRefArr (const ref int[] param);
492498
int[] inArr (in int[] param);
493499
int[] immutableArr (immutable int[] param);
500+
E getEnum(E value);
494501
}
495502

496503
class Example8 : Example8API
@@ -536,6 +543,14 @@ class Example8 : Example8API
536543
{
537544
return param;
538545
}
546+
547+
E getEnum(E value)
548+
{
549+
final switch (value) {
550+
case E.foo: return E.bar;
551+
case E.bar: return E.foo;
552+
}
553+
}
539554
}
540555

541556
unittest
@@ -552,6 +567,7 @@ unittest
552567
assert (routes[5].method == HTTPMethod.POST && routes[5].pattern == "/example8_api/const_ref_arr");
553568
assert (routes[6].method == HTTPMethod.POST && routes[6].pattern == "/example8_api/in_arr");
554569
assert (routes[7].method == HTTPMethod.POST && routes[7].pattern == "/example8_api/immutable_arr");
570+
assert (routes[8].method == HTTPMethod.GET && routes[7].pattern == "/example8_api/enum");
555571
}
556572

557573
void runTests(string url)
@@ -714,6 +730,9 @@ void runTests(string url)
714730
assert(arr.equal(api.constRefArr(arr)));
715731
assert(arr.equal(api.immutableArr(cast(immutable(int[])) arr)));
716732
assert(arr.equal(api.inArr(arr)));
733+
assert(api.getEnum(Example8API.E.foo) == Example8API.E.bar);
734+
assert(api.getEnum(Example8API.E.bar) == Example8API.E.foo);
735+
assert(api.getEnum(Example8API.E.baz) == Example8API.E.bar);
717736
}
718737
}
719738

web/vibe/web/rest.d

+17-10
Original file line numberDiff line numberDiff line change
@@ -1868,8 +1868,7 @@ private auto executeClientMethod(I, size_t ridx, ARGS...)
18681868
query.filterURLEncode(ARGS[i].toString());
18691869
else
18701870
// Note: CTFE triggers compiler bug here (think we are returning Json, not string).
1871-
query.filterURLEncode(toRestString(
1872-
serializeWithPolicy!(JsonSerializer, SerPolicyType)(ARGS[i])));
1871+
query.filterURLEncode(toRestString!SerPolicyType(ARGS[i]));
18731872
}
18741873

18751874
foreach (i, PT; PTT) {
@@ -1914,7 +1913,7 @@ private auto executeClientMethod(I, size_t ridx, ARGS...)
19141913
foreach (j, PT; PTT) {
19151914
static if (sroute.parameters[j].name[0] == '_' || sroute.parameters[j].name == "id") {
19161915
case sroute.parameters[j].name:
1917-
url ~= urlEncode(toRestString(serializeToJson(ARGS[j])));
1916+
url ~= urlEncode(toRestString(ARGS[j]));
19181917
goto sbrk;
19191918
}
19201919
}
@@ -2103,14 +2102,22 @@ private {
21032102
import vibe.data.json;
21042103
import std.conv : to;
21052104

2106-
string toRestString(Json value)
2105+
string toRestString(alias SerPolicyType = DefaultPolicy, T)(T value)
21072106
@safe {
2108-
switch (value.type) {
2109-
default: return value.toString();
2110-
case Json.Type.bool_: return value.get!bool ? "true" : "false";
2111-
case Json.Type.int_: return to!string(value.get!long);
2112-
case Json.Type.float_: return to!string(value.get!double);
2113-
case Json.Type.string: return value.get!string;
2107+
import std.array : Appender, appender;
2108+
import std.uuid : UUID;
2109+
static if (isInstanceOf!(Nullable, T)) return T(fromRestString!(typeof(T.init.get()))(value));
2110+
else static if (is(T == bool)) return value ? "true" : "false";
2111+
else static if (is(T : int)) return to!string(value);
2112+
else static if (is(T : double)) return to!string(value); // FIXME: formattedWrite(dst, "%.16g", json.get!double);
2113+
else static if (is(string : T)) return value;
2114+
else static if (__traits(compiles, value.toISOExtString)) return value.toISOExtString;
2115+
else static if (__traits(compiles, value.toString)) return value.toString;
2116+
else static if (is(T == UUID)) return value.toString();
2117+
else {
2118+
auto ret = appender!string;
2119+
serializeWithPolicy!(JsonStringSerializer!(Appender!string), SerPolicyType, T)(value, ret);
2120+
return ret.data;
21142121
}
21152122
}
21162123

0 commit comments

Comments
 (0)