@@ -28,14 +28,43 @@ module Client = {
28
28
// Very rudimentary form data bindings
29
29
module FormData = {
30
30
type t
31
- type value
31
+ type file
32
+
33
+ type formValue =
34
+ | String (string )
35
+ | File (file )
32
36
33
37
@new external make : unit => t = "FormData"
34
38
35
39
@send external append : (t , string , ~filename : string = ?) => unit = "append"
36
40
@send external delete : (t , string ) => unit = "delete"
37
- @send external get : (t , string ) => option <value > = "get"
38
- @send external getAll : (t , string ) => array <value > = "getAll"
41
+ @return (nullable ) @send external getUnsafe : (t , string ) => option <'a > = "get"
42
+ @send external getAllUnsafe : (t , string ) => array <'a > = "getAll"
43
+
44
+ let getString = (formData , name ) => {
45
+ switch formData -> getUnsafe (name ) {
46
+ | Some (value ) => Js .typeof (value ) === "string" ? Some (value ) : None
47
+ | _ => None
48
+ }
49
+ }
50
+
51
+ external _asFile : 'a => file = "%identity"
52
+
53
+ let getFile = (formData , name ) => {
54
+ switch formData -> getUnsafe (name ) {
55
+ | Some (value ) => Js .typeof (value ) === "string" ? None : Some (value -> _asFile )
56
+ | _ => None
57
+ }
58
+ }
59
+
60
+ let getAll = (t , string ) => {
61
+ t
62
+ -> getAllUnsafe (string )
63
+ -> Js .Array2 .map (value => {
64
+ Js .typeof (value ) === "string" ? String (value ) : File (value -> _asFile )
65
+ })
66
+ }
67
+
39
68
@send external set : (string , string ) => unit = "set"
40
69
@send external has : string => bool = "has"
41
70
// @send external keys: t => Iterator.t<string> = "keys";
0 commit comments