@@ -1868,8 +1868,7 @@ private auto executeClientMethod(I, size_t ridx, ARGS...)
1868
1868
query.filterURLEncode(ARGS [i].toString());
1869
1869
else
1870
1870
// 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]));
1873
1872
}
1874
1873
1875
1874
foreach (i, PT ; PTT ) {
@@ -1914,7 +1913,7 @@ private auto executeClientMethod(I, size_t ridx, ARGS...)
1914
1913
foreach (j, PT ; PTT ) {
1915
1914
static if (sroute.parameters[j].name[0 ] == ' _' || sroute.parameters[j].name == " id" ) {
1916
1915
case sroute.parameters[j].name:
1917
- url ~= urlEncode(toRestString(serializeToJson( ARGS [j]) ));
1916
+ url ~= urlEncode(toRestString(ARGS [j]));
1918
1917
goto sbrk;
1919
1918
}
1920
1919
}
@@ -2103,14 +2102,22 @@ private {
2103
2102
import vibe.data.json;
2104
2103
import std.conv : to;
2105
2104
2106
- string toRestString (Json value)
2105
+ string toRestString (alias SerPolicyType = DefaultPolicy, T)(T value)
2107
2106
@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;
2114
2121
}
2115
2122
}
2116
2123
0 commit comments