From ec7285a8a5addc883868138cb3061dd574bc1fe6 Mon Sep 17 00:00:00 2001 From: Torben Ewert Date: Tue, 5 May 2020 19:27:03 +0200 Subject: [PATCH] TASK: Split into multiple Modules --- .gitignore | 4 +- Readme.md | 10 +- src/Hermes.re | 202 +++--------------- src/Hermes.rei | 10 + src/Hermes/Hermes_Client.re | 13 ++ src/Hermes/Hermes_Client.rei | 3 + src/Hermes/Hermes_Event.re | 28 +++ src/Hermes/Hermes_Event.rei | 6 + src/Hermes/Hermes_Header.re | 23 ++ src/Hermes/Hermes_Header.rei | 8 + src/Hermes/Hermes_Method.re | 29 +++ src/Hermes/Hermes_Method.rei | 27 +++ src/Hermes/Hermes_QueryString.re | 23 ++ src/Hermes/Hermes_QueryString.rei | 8 + src/Hermes/Hermes_ResponseType.re | 33 +++ src/Hermes/Hermes_ResponseType.rei | 21 ++ src/Hermes/Hermes_Types.re | 3 + src/Hermes/Hermes_Types.rei | 3 + src/Hermes/Types/Hermes_Types_Client.re | 9 + src/Hermes/Types/Hermes_Types_Method.re | 8 + src/Hermes/Types/Hermes_Types_ResponseType.re | 10 + 21 files changed, 305 insertions(+), 176 deletions(-) create mode 100644 src/Hermes.rei create mode 100644 src/Hermes/Hermes_Client.re create mode 100644 src/Hermes/Hermes_Client.rei create mode 100644 src/Hermes/Hermes_Event.re create mode 100644 src/Hermes/Hermes_Event.rei create mode 100644 src/Hermes/Hermes_Header.re create mode 100644 src/Hermes/Hermes_Header.rei create mode 100644 src/Hermes/Hermes_Method.re create mode 100644 src/Hermes/Hermes_Method.rei create mode 100644 src/Hermes/Hermes_QueryString.re create mode 100644 src/Hermes/Hermes_QueryString.rei create mode 100644 src/Hermes/Hermes_ResponseType.re create mode 100644 src/Hermes/Hermes_ResponseType.rei create mode 100644 src/Hermes/Hermes_Types.re create mode 100644 src/Hermes/Hermes_Types.rei create mode 100644 src/Hermes/Types/Hermes_Types_Client.re create mode 100644 src/Hermes/Types/Hermes_Types_Method.re create mode 100644 src/Hermes/Types/Hermes_Types_ResponseType.re diff --git a/.gitignore b/.gitignore index e190e4d..fee1c8d 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,6 @@ node_modules # Bucklescript lib .merlin -*.bs.js \ No newline at end of file +*.bs.js + +src/Test.re \ No newline at end of file diff --git a/Readme.md b/Readme.md index 02bee83..ff30208 100644 --- a/Readme.md +++ b/Readme.md @@ -33,16 +33,16 @@ Then add `@space-labs/hermes` as a dependency to `bsconfig.json`: ### Example ```reason -Hermes.get("http://localhost:8081/") -->Hermes.setQueryString([ +Hermes.Method.get("http://localhost:8081/") +->Hermes.ResponseType.setJson +->Hermes.QueryString.set([ ("firstname", "Max"), ("lastname", "Mustermann"), ("username", "max"), ("email", "max@mustermann.de"), ]) -->Hermes.setHeaders([("authorization", "Bearer 123")]) -->Hermes.setResponseTypeJSON -->Hermes.onLoad(response => { +->Hermes.Header.add("authorization", "Bearer 123") +->Hermes.Event.onLoad(response => { switch (response) { | Ok(Some(data)) => Js.Console.log(data) | Ok(None) => Js.Console.info("No Response!") diff --git a/src/Hermes.re b/src/Hermes.re index 2ecd797..670b49e 100644 --- a/src/Hermes.re +++ b/src/Hermes.re @@ -1,161 +1,15 @@ -type method = - | GET - | POST - | PUT - | PATCH - | DELETE - | HEAD - | OPTIONS; - -type responseType('a) = - | ArrayBufferResponse(option(Js.Typed_array.array_buffer)) - : responseType(option(Js.Typed_array.array_buffer)) - | DocumentResponse(option(Dom.document)) - : responseType(option(Dom.document)) - | JSONResponse(option(Js.Json.t)): responseType(option(Js.Json.t)) - | TextResponse(option(string)): responseType(option(string)); - -type response('a) = - | Error(string) - | Ok('a); - -type t('a) = { - url: string, - method, - queryString: list((string, string)), - formData: list((string, string)), - headers: list((string, string)), - response: 'a, - onLoad: response('a) => unit, -}; - -let make = (~url, ~method) => { - { - url, - method, - queryString: [], - response: TextResponse(None), - onLoad: _response => (), - formData: [], - headers: [], - }; -}; - -/* ================= METHODS =============== */ -let get = (url: string) => { - make(~url, ~method=GET); -}; - -let post = (url: string) => { - make(~url, ~method=POST); -}; - -let put = (url: string) => { - make(~url, ~method=PUT); -}; - -let patch = (url: string) => { - make(~url, ~method=PATCH); -}; - -let delete = (url: string) => { - make(~url, ~method=DELETE); -}; - -let head = (url: string) => { - make(~url, ~method=HEAD); -}; - -let options = (url: string) => { - make(~url, ~method=OPTIONS); -}; - -/* ================= HEADERS =============== */ -let addHeader = (client, header) => { - {...client, headers: [header, ...client.headers]}; -}; - -let setHeaders = (client, headers) => { - {...client, headers}; -}; - -let removeHeader = (client, headerToRemove) => { - { - ...client, - headers: - Belt.List.keep( - client.headers, - header => { - let (key, _value) = header; - key !== headerToRemove; - }, - ), - }; -}; - -/* ================= DATA =============== */ -let addQueryString = (client, queryString) => { - {...client, queryString: [queryString, ...client.queryString]}; -}; - -let setQueryString = (client, queryString) => { - {...client, queryString}; -}; - -let removeQueryString = (client, keyToRemove) => { - { - ...client, - headers: - Belt.List.keep( - client.headers, - header => { - let (key, _value) = header; - key !== keyToRemove; - }, - ), - }; -}; - -/* ================= RESPONSE TYPES =============== */ -let setResponseTypeText = client => { - {...client, response: TextResponse(None), onLoad: _ => ()}; -}; - -let setResponseTypeDocument = client => { - {...client, response: DocumentResponse(None), onLoad: _ => ()}; -}; - -let setResponseTypeJSON = client => { - {...client, response: JSONResponse(None), onLoad: _ => ()}; -}; - -let setResponseTypeArrayBuffer = client => { - {...client, response: ArrayBufferResponse(None), onLoad: _ => ()}; -}; +module Client = Hermes_Client; +module Event = Hermes_Event; +module Header = Hermes_Header; +module Method = Hermes_Method; +module QueryString = Hermes_QueryString; +module ResponseType = Hermes_ResponseType; +module Types = Hermes_Types; /* ================= FINISHERS =============== */ -let onLoad: - type a. (t(responseType(a)), response(a) => unit) => t(responseType(a)) = - (client, callback) => { - let eval: type a. responseType(a) => a = - fun - | ArrayBufferResponse(b) => b - | DocumentResponse(d) => d - | JSONResponse(j) => j - | TextResponse(t) => t; - - { - ...client, - onLoad: data => { - switch (data) { - | Ok(data) => callback(Ok(eval(data))) - | Error(message) => callback(Error(message)) - }; - }, - }; - }; - -let send: type a. t(responseType(a)) => option(unit => unit) = +let send: + type a. + Types.Client.t(Types.ResponseType.payload(a)) => option(unit => unit) = client => { let xhr = Hermes_XHR.make(); @@ -201,44 +55,52 @@ let send: type a. t(responseType(a)) => option(unit => unit) = }); xhr->Hermes_XHR.addEventListener( - `error(_ => {client.onLoad(Error(xhr->Hermes_XHR.statusText))}), + `error( + _ => { + client.onLoad(Types.ResponseType.Error(xhr->Hermes_XHR.statusText)) + }, + ), ); xhr->Hermes_XHR.addEventListener( - `timeout(_ => {client.onLoad(Error(xhr->Hermes_XHR.statusText))}), + `timeout( + _ => { + client.onLoad(Types.ResponseType.Error(xhr->Hermes_XHR.statusText)) + }, + ), ); xhr->Hermes_XHR.addEventListener( `load( _ => { switch (client.response) { - | TextResponse(_) => + | Types.ResponseType.TextResponse(_) => client.onLoad( - Ok( - TextResponse( + Types.ResponseType.Ok( + Types.ResponseType.TextResponse( xhr->Hermes_XHR.responseText->Js.Nullable.toOption, ), ), ) - | JSONResponse(_) => + | Types.ResponseType.JSONResponse(_) => client.onLoad( - Ok( - JSONResponse( + Types.ResponseType.Ok( + Types.ResponseType.JSONResponse( xhr->Hermes_XHR.responseJson->Js.Nullable.toOption, ), ), ) - | DocumentResponse(_) => + | Types.ResponseType.DocumentResponse(_) => client.onLoad( - Ok( - DocumentResponse( + Types.ResponseType.Ok( + Types.ResponseType.DocumentResponse( xhr->Hermes_XHR.responseDocument->Js.Nullable.toOption, ), ), ) - | ArrayBufferResponse(_) => + | Types.ResponseType.ArrayBufferResponse(_) => client.onLoad( - Ok( - ArrayBufferResponse( + Types.ResponseType.Ok( + Types.ResponseType.ArrayBufferResponse( xhr->Hermes_XHR.responseArrayBuffer->Js.Nullable.toOption, ), ), diff --git a/src/Hermes.rei b/src/Hermes.rei new file mode 100644 index 0000000..c77c247 --- /dev/null +++ b/src/Hermes.rei @@ -0,0 +1,10 @@ +module Client = Hermes_Client; +module Event = Hermes_Event; +module Header = Hermes_Header; +module Method = Hermes_Method; +module QueryString = Hermes_QueryString; +module ResponseType = Hermes_ResponseType; +module Types = Hermes_Types; + +let send: + Types.Client.t(Types.ResponseType.payload('a)) => option(unit => unit); \ No newline at end of file diff --git a/src/Hermes/Hermes_Client.re b/src/Hermes/Hermes_Client.re new file mode 100644 index 0000000..fca2bf3 --- /dev/null +++ b/src/Hermes/Hermes_Client.re @@ -0,0 +1,13 @@ +open Hermes_Types_Client; + +let make = (~url, ~method) => { + { + url, + method, + queryString: [], + response: Hermes_Types_ResponseType.TextResponse(None), + onLoad: _response => (), + formData: [], + headers: [], + }; +}; \ No newline at end of file diff --git a/src/Hermes/Hermes_Client.rei b/src/Hermes/Hermes_Client.rei new file mode 100644 index 0000000..953c7a9 --- /dev/null +++ b/src/Hermes/Hermes_Client.rei @@ -0,0 +1,3 @@ +let make: + (~url: string, ~method: Hermes_Types_Method.t) => + Hermes_Types_Client.t(Hermes_Types_ResponseType.payload(option(string))); \ No newline at end of file diff --git a/src/Hermes/Hermes_Event.re b/src/Hermes/Hermes_Event.re new file mode 100644 index 0000000..a791749 --- /dev/null +++ b/src/Hermes/Hermes_Event.re @@ -0,0 +1,28 @@ +open Hermes_Types_Client; + +let onLoad: + type a. + ( + t(Hermes_Types_ResponseType.payload(a)), + Hermes_Types_ResponseType.t(a) => unit + ) => + t(Hermes_Types_ResponseType.payload(a)) = + (client, callback) => { + let eval: type a. Hermes_Types_ResponseType.payload(a) => a = + fun + | Hermes_Types_ResponseType.ArrayBufferResponse(b) => b + | Hermes_Types_ResponseType.DocumentResponse(d) => d + | Hermes_Types_ResponseType.JSONResponse(j) => j + | Hermes_Types_ResponseType.TextResponse(t) => t; + + { + ...client, + onLoad: data => { + switch (data) { + | Hermes_Types_ResponseType.Ok(data) => callback(Ok(eval(data))) + | Hermes_Types_ResponseType.Error(message) => + callback(Error(message)) + }; + }, + }; + }; \ No newline at end of file diff --git a/src/Hermes/Hermes_Event.rei b/src/Hermes/Hermes_Event.rei new file mode 100644 index 0000000..6493605 --- /dev/null +++ b/src/Hermes/Hermes_Event.rei @@ -0,0 +1,6 @@ +let onLoad: + ( + Hermes_Types_Client.t(Hermes_Types_ResponseType.payload('a)), + Hermes_Types_ResponseType.t('a) => unit + ) => + Hermes_Types_Client.t(Hermes_Types_ResponseType.payload('a)); \ No newline at end of file diff --git a/src/Hermes/Hermes_Header.re b/src/Hermes/Hermes_Header.re new file mode 100644 index 0000000..9fa6331 --- /dev/null +++ b/src/Hermes/Hermes_Header.re @@ -0,0 +1,23 @@ +open Hermes_Types_Client; + +let add = (client, key, value) => { + {...client, headers: [(key, value), ...client.headers]}; +}; + +let set = (client, headers) => { + {...client, headers}; +}; + +let remove = (client, headerToRemove) => { + { + ...client, + headers: + Belt.List.keep( + client.headers, + header => { + let (key, _value) = header; + key !== headerToRemove; + }, + ), + }; +}; \ No newline at end of file diff --git a/src/Hermes/Hermes_Header.rei b/src/Hermes/Hermes_Header.rei new file mode 100644 index 0000000..670dd72 --- /dev/null +++ b/src/Hermes/Hermes_Header.rei @@ -0,0 +1,8 @@ +let add: + (Hermes_Types_Client.t('a), string, string) => Hermes_Types_Client.t('a); + +let set: + (Hermes_Types_Client.t('a), list((string, string))) => + Hermes_Types_Client.t('a); + +let remove: (Hermes_Types_Client.t('a), string) => Hermes_Types_Client.t('a); \ No newline at end of file diff --git a/src/Hermes/Hermes_Method.re b/src/Hermes/Hermes_Method.re new file mode 100644 index 0000000..4276d7a --- /dev/null +++ b/src/Hermes/Hermes_Method.re @@ -0,0 +1,29 @@ +open Hermes_Types_Method; + +let get = (url: string) => { + Hermes_Client.make(~url, ~method=GET); +}; + +let post = (url: string) => { + Hermes_Client.make(~url, ~method=POST); +}; + +let put = (url: string) => { + Hermes_Client.make(~url, ~method=PUT); +}; + +let patch = (url: string) => { + Hermes_Client.make(~url, ~method=PATCH); +}; + +let delete = (url: string) => { + Hermes_Client.make(~url, ~method=DELETE); +}; + +let head = (url: string) => { + Hermes_Client.make(~url, ~method=HEAD); +}; + +let options = (url: string) => { + Hermes_Client.make(~url, ~method=OPTIONS); +}; \ No newline at end of file diff --git a/src/Hermes/Hermes_Method.rei b/src/Hermes/Hermes_Method.rei new file mode 100644 index 0000000..c179c2f --- /dev/null +++ b/src/Hermes/Hermes_Method.rei @@ -0,0 +1,27 @@ +let get: + string => + Hermes_Types_Client.t(Hermes_Types_ResponseType.payload(option(string))); + +let post: + string => + Hermes_Types_Client.t(Hermes_Types_ResponseType.payload(option(string))); + +let put: + string => + Hermes_Types_Client.t(Hermes_Types_ResponseType.payload(option(string))); + +let patch: + string => + Hermes_Types_Client.t(Hermes_Types_ResponseType.payload(option(string))); + +let delete: + string => + Hermes_Types_Client.t(Hermes_Types_ResponseType.payload(option(string))); + +let head: + string => + Hermes_Types_Client.t(Hermes_Types_ResponseType.payload(option(string))); + +let options: + string => + Hermes_Types_Client.t(Hermes_Types_ResponseType.payload(option(string))); \ No newline at end of file diff --git a/src/Hermes/Hermes_QueryString.re b/src/Hermes/Hermes_QueryString.re new file mode 100644 index 0000000..e4f1e87 --- /dev/null +++ b/src/Hermes/Hermes_QueryString.re @@ -0,0 +1,23 @@ +open Hermes_Types_Client; + +let add = (client, key, value) => { + {...client, queryString: [(key, value), ...client.queryString]}; +}; + +let set = (client, queryString) => { + {...client, queryString}; +}; + +let remove = (client, keyToRemove) => { + { + ...client, + queryString: + Belt.List.keep( + client.queryString, + queryString => { + let (key, _value) = queryString; + key !== keyToRemove; + }, + ), + }; +}; \ No newline at end of file diff --git a/src/Hermes/Hermes_QueryString.rei b/src/Hermes/Hermes_QueryString.rei new file mode 100644 index 0000000..670dd72 --- /dev/null +++ b/src/Hermes/Hermes_QueryString.rei @@ -0,0 +1,8 @@ +let add: + (Hermes_Types_Client.t('a), string, string) => Hermes_Types_Client.t('a); + +let set: + (Hermes_Types_Client.t('a), list((string, string))) => + Hermes_Types_Client.t('a); + +let remove: (Hermes_Types_Client.t('a), string) => Hermes_Types_Client.t('a); \ No newline at end of file diff --git a/src/Hermes/Hermes_ResponseType.re b/src/Hermes/Hermes_ResponseType.re new file mode 100644 index 0000000..f12d9af --- /dev/null +++ b/src/Hermes/Hermes_ResponseType.re @@ -0,0 +1,33 @@ +open Hermes_Types_Client; + +let setText = client => { + { + ...client, + response: Hermes_Types_ResponseType.TextResponse(None), + onLoad: _ => (), + }; +}; + +let setDocument = client => { + { + ...client, + response: Hermes_Types_ResponseType.DocumentResponse(None), + onLoad: _ => (), + }; +}; + +let setJson = client => { + { + ...client, + response: Hermes_Types_ResponseType.JSONResponse(None), + onLoad: _ => (), + }; +}; + +let setArrayBuffer = client => { + { + ...client, + response: Hermes_Types_ResponseType.ArrayBufferResponse(None), + onLoad: _ => (), + }; +}; \ No newline at end of file diff --git a/src/Hermes/Hermes_ResponseType.rei b/src/Hermes/Hermes_ResponseType.rei new file mode 100644 index 0000000..2d8e6c6 --- /dev/null +++ b/src/Hermes/Hermes_ResponseType.rei @@ -0,0 +1,21 @@ +let setText: + Hermes_Types_Client.t('a) => + Hermes_Types_Client.t(Hermes_Types_ResponseType.payload(option(string))); + +let setDocument: + Hermes_Types_Client.t('a) => + Hermes_Types_Client.t( + Hermes_Types_ResponseType.payload(option(Dom.document)), + ); + +let setJson: + Hermes_Types_Client.t('a) => + Hermes_Types_Client.t( + Hermes_Types_ResponseType.payload(option(Js.Json.t)), + ); + +let setArrayBuffer: + Hermes_Types_Client.t('a) => + Hermes_Types_Client.t( + Hermes_Types_ResponseType.payload(option(Js.Typed_array.ArrayBuffer.t)), + ); \ No newline at end of file diff --git a/src/Hermes/Hermes_Types.re b/src/Hermes/Hermes_Types.re new file mode 100644 index 0000000..cca82b8 --- /dev/null +++ b/src/Hermes/Hermes_Types.re @@ -0,0 +1,3 @@ +module Client = Hermes_Types_Client; +module Method = Hermes_Types_Method; +module ResponseType = Hermes_Types_ResponseType; \ No newline at end of file diff --git a/src/Hermes/Hermes_Types.rei b/src/Hermes/Hermes_Types.rei new file mode 100644 index 0000000..cca82b8 --- /dev/null +++ b/src/Hermes/Hermes_Types.rei @@ -0,0 +1,3 @@ +module Client = Hermes_Types_Client; +module Method = Hermes_Types_Method; +module ResponseType = Hermes_Types_ResponseType; \ No newline at end of file diff --git a/src/Hermes/Types/Hermes_Types_Client.re b/src/Hermes/Types/Hermes_Types_Client.re new file mode 100644 index 0000000..5795e19 --- /dev/null +++ b/src/Hermes/Types/Hermes_Types_Client.re @@ -0,0 +1,9 @@ +type t('a) = { + url: string, + method: Hermes_Types_Method.t, + queryString: list((string, string)), + formData: list((string, string)), + headers: list((string, string)), + response: 'a, + onLoad: Hermes_Types_ResponseType.t('a) => unit, +}; \ No newline at end of file diff --git a/src/Hermes/Types/Hermes_Types_Method.re b/src/Hermes/Types/Hermes_Types_Method.re new file mode 100644 index 0000000..7c99e40 --- /dev/null +++ b/src/Hermes/Types/Hermes_Types_Method.re @@ -0,0 +1,8 @@ +type t = + | GET + | POST + | PUT + | PATCH + | DELETE + | HEAD + | OPTIONS; \ No newline at end of file diff --git a/src/Hermes/Types/Hermes_Types_ResponseType.re b/src/Hermes/Types/Hermes_Types_ResponseType.re new file mode 100644 index 0000000..7744194 --- /dev/null +++ b/src/Hermes/Types/Hermes_Types_ResponseType.re @@ -0,0 +1,10 @@ +type payload('a) = + | ArrayBufferResponse(option(Js.Typed_array.ArrayBuffer.t)) + : payload(option(Js.Typed_array.ArrayBuffer.t)) + | DocumentResponse(option(Dom.document)): payload(option(Dom.document)) + | JSONResponse(option(Js.Json.t)): payload(option(Js.Json.t)) + | TextResponse(option(string)): payload(option(string)); + +type t('a) = + | Error(string) + | Ok('a); \ No newline at end of file -- 2.51.2