@@ -0,0 +1,122 @@
1+module Fetch.Internal.Request where
2+
3+import Prelude
4+
5+import Data.HTTP.Method (Method)
6+import Data.Newtype (un)
7+import Data.Symbol (class IsSymbol)
8+import Effect (Effect)
9+import Effect.Uncurried (runEffectFn2)
10+import Fetch.Core.Headers (Headers)
11+import Fetch.Core.Headers as CoreHeaders
12+import Fetch.Core.Integrity (Integrity(..))
13+import Fetch.Core.Integrity as CoreIntegrity
14+import Fetch.Core.Referrer (Referrer)
15+import Fetch.Core.Referrer as CoreReferrer
16+import Fetch.Core.Referrer as Referrer
17+import Fetch.Core.ReferrerPolicy (ReferrerPolicy)
18+import Fetch.Core.ReferrerPolicy as CoreReferrerPolicy
19+import Fetch.Core.ReferrerPolicy as ReferrerPolicy
20+import Fetch.Core.Request (_unsafeNew)
21+import Fetch.Core.Request as CoreRequest
22+import Fetch.Core.RequestBody (RequestBody)
23+import Fetch.Core.RequestCache (RequestCache)
24+import Fetch.Core.RequestCache as CoreRequestCache
25+import Fetch.Core.RequestCache as RequestCache
26+import Fetch.Core.RequestCredentials (RequestCredentials)
27+import Fetch.Core.RequestCredentials as CoreRequestCredentials
28+import Fetch.Core.RequestCredentials as RequestCredentials
29+import Fetch.Core.RequestMode (RequestMode)
30+import Fetch.Core.RequestMode as CoreRequestMode
31+import Fetch.Core.RequestMode as RequestMode
32+import Fetch.Internal.RequestBody (class ToRequestBody, toRequestBody)
33+import Prim.Row (class Lacks, class Union)
34+import Prim.Row as R
35+import Prim.RowList as RL
36+import Record (delete, get, insert)
37+import Type.Proxy (Proxy(..))
38+import Type.Row.Homogeneous (class Homogeneous)
39+
40+type HighlevelRequestOptions headers body =
41+ ( method :: Method
42+ , headers :: { | headers }
43+ , body :: body
44+ , credentials :: CoreRequestCredentials.RequestCredentials
45+ , cache :: CoreRequestCache.RequestCache
46+ , mode :: CoreRequestMode.RequestMode
47+ , referrer :: CoreReferrer.Referrer
48+ , referrerPolicy :: CoreReferrerPolicy.ReferrerPolicy
49+ , integrity :: CoreIntegrity.Integrity
50+ )
51+
52+
53+new
54+ :: forall input thru
55+ . Union input thru CoreRequest.UnsafeRequestOptions
56+ => String
57+ -> { | input }
58+ -> Effect CoreRequest.Request
59+new url options = runEffectFn2 _unsafeNew url options
60+
61+class ToCoreRequestOptions input output | input -> output where
62+ convert :: Record input -> Record output
63+
64+instance (Union rIn thru (HighlevelRequestOptions headers body), RL.RowToList rIn rInRL, ToCoreRequestOptionsHelper rIn rInRL rOut) => ToCoreRequestOptions (| rIn) (| rOut) where
65+ convert = convertHelper (Proxy :: Proxy rInRL)
66+
67+class ToCoreRequestOptionsHelper :: forall k. Row Type -> k -> Row Type -> Constraint
68+class ToCoreRequestOptionsHelper input inputRL output | inputRL -> output where
69+ convertHelper :: Proxy inputRL -> Record input -> Record output
70+
71+instance ToCoreRequestOptionsHelper r RL.Nil () where
72+ convertHelper _ _ = {}
73+else instance
74+ ( ToCoreRequestOptionsConverter sym tpeIn tpeOut
75+ , R.Cons sym tpeIn tailIn r
76+ , RL.RowToList tailIn tailInRL
77+ , Lacks sym tailIn
78+ , IsSymbol sym
79+ , ToCoreRequestOptionsHelper tailIn tailInRL tailOutput
80+ , R.Cons sym tpeOut tailOutput output
81+ , Lacks sym tailOutput
82+ ) =>
83+ ToCoreRequestOptionsHelper r (RL.Cons sym tpeIn tailInRL) output where
84+ convertHelper _ r = insert (Proxy :: Proxy sym) head tail
85+ where
86+ tail :: Record tailOutput
87+ tail = delete (Proxy :: Proxy sym) r # convertHelper (Proxy :: Proxy tailInRL)
88+
89+ head :: tpeOut
90+ head = get (Proxy :: Proxy sym) r # convertImpl (Proxy :: Proxy sym)
91+
92+class ToCoreRequestOptionsConverter :: forall k. k -> Type -> Type -> Constraint
93+class ToCoreRequestOptionsConverter sym input output | sym input -> output where
94+ convertImpl :: Proxy sym -> input -> output
95+
96+instance ToCoreRequestOptionsConverter "method" Method String where
97+ convertImpl _ = show
98+
99+instance (Homogeneous r String) => ToCoreRequestOptionsConverter "headers" { | r } Headers where
100+ convertImpl _ = CoreHeaders.fromRecord
101+
102+instance (ToRequestBody body) => ToCoreRequestOptionsConverter "body" body RequestBody where
103+ convertImpl _ = toRequestBody
104+
105+instance ToCoreRequestOptionsConverter "credentials" RequestCredentials String where
106+ convertImpl _ = RequestCredentials.toString
107+
108+instance ToCoreRequestOptionsConverter "cache" RequestCache String where
109+ convertImpl _ = RequestCache.toString
110+
111+instance ToCoreRequestOptionsConverter "mode" RequestMode String where
112+ convertImpl _ = RequestMode.toString
113+
114+instance ToCoreRequestOptionsConverter "referrer" Referrer String where
115+ convertImpl _ = Referrer.toString
116+
117+instance ToCoreRequestOptionsConverter "referrerPolicy" ReferrerPolicy String where
118+ convertImpl _ = ReferrerPolicy.toString
119+
120+instance ToCoreRequestOptionsConverter "integrity" Integrity String where
121+ convertImpl _ = un Integrity
122+