1 /**
2 * Copyright © DiamondMVC 2019
3 * License: MIT (https://github.com/DiamondMVC/Diamond/blob/master/LICENSE)
4 * Author: Jacob Jensen (bausshf)
5 */
6 module diamond.http.remote;
7
8 import vibe.d : HTTPClientRequest, HTTPClientResponse, requestHTTP, HTTPMethod;
9
10 import diamond.http.method;
11
12 /**
13 * Creates a remote request.
14 * Params:
15 * url = The url of the resource.
16 * method = The http method of the request.
17 * responser = Handler for managing the response of the resource.
18 * requester = Handler for setting up custom request configurations.
19 */
20 void remoteRequest
21 (
22 string url,
23 HttpMethod method,
24 scope void delegate(scope HTTPClientResponse) responder = null,
25 scope void delegate(scope HTTPClientRequest) requester = null,
26 )
27 {
28 return requestHTTP
29 (
30 url,
31 (scope request)
32 {
33 request.method = cast(HTTPMethod)method;
34
35 if (requester !is null)
36 {
37 requester(request);
38 }
39 },
40 (scope response)
41 {
42 if (responder !is null)
43 {
44 responder(response);
45 }
46 }
47 );
48 }
49
50 /**
51 * Creates a remote json request.
52 * Params:
53 * url = The url of the resource.
54 * method = The http method of the request.
55 * responser = Handler for managing the json response.
56 * requester = Handler for setting up custom request configurations.
57 */
58 void remoteJson(T, CTORARGS...)
59 (
60 string url,
61 HttpMethod method,
62 scope void delegate(T) responder,
63 scope void delegate(scope HTTPClientRequest) requester,
64 CTORARGS args
65 )
66 {
67 return fetchRemote
68 (
69 url, method,
70 (scope response)
71 {
72 import vibe.data.json;
73
74 static if (is(T == struct))
75 {
76 T value;
77
78 value.deserializeJson(json);
79
80 responder(value);
81 }
82 else static if (is(T == class))
83 {
84 auto value = new T(args);
85
86 value.deserializeJson(json);
87
88 responder(value);
89 }
90 else
91 {
92 static assert(0);
93 }
94 },
95 requester
96 );
97 }