/
JavaScript.elm
141 lines (106 loc) · 3.1 KB
/
JavaScript.elm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
module JavaScript exposing
( run
, Error(..), ErrorCode(..), ErrorMessage(..), ErrorName(..), errorToString, decodeError
)
{-|
@docs run
@docs Error, ErrorCode, ErrorMessage, ErrorName, errorToString, decodeError
-}
import Json.Decode
import Task
{-| Run JavaScript code.
-}
run : String -> Json.Decode.Value -> Json.Decode.Decoder b -> Task.Task Error b
run code arg decoder =
let
toError : Json.Decode.Value -> Error
toError =
decodeError
task : Json.Decode.Value -> Task.Task Error Json.Decode.Value
task arg_ =
Task.fail FileNotPatched
in
task arg
|> Task.andThen
(\x ->
case x |> Json.Decode.decodeValue decoder of
Ok b ->
Task.succeed b
Err b ->
Task.fail (DecodeError b)
)
--
type Error
= FileNotPatched
| Exception ErrorName ErrorCode ErrorMessage
| DecodeError Json.Decode.Error
errorToString : Error -> String
errorToString a =
let
indent : String -> String
indent b =
b
|> String.split "\n"
|> List.map ((++) " ")
|> String.join "\n"
in
case a of
FileNotPatched ->
"Compiled file needs to be processed via elm-ffi command."
Exception name code msg ->
"There was a runtime error. More details:\n"
++ indent
(("name: " ++ (\(ErrorName x) -> x) name)
++ "\n"
++ ("code: " ++ (\(ErrorCode x) -> x) code)
++ "\n"
++ ("message: " ++ (\(ErrorMessage x) -> x) msg)
)
DecodeError b ->
"There was a decode error. More details:\n" ++ indent (Json.Decode.errorToString b)
decodeError : Json.Decode.Value -> Error
decodeError a =
Exception
(ErrorName
(Result.withDefault ""
(Json.Decode.decodeValue
(Json.Decode.field "name" Json.Decode.string)
a
)
)
)
(ErrorCode
(Result.withDefault ""
(Json.Decode.decodeValue
(Json.Decode.field "code"
(Json.Decode.oneOf
[ Json.Decode.string
, Json.Decode.map String.fromInt Json.Decode.int
]
)
)
a
)
)
)
(ErrorMessage
(Result.withDefault ""
(Json.Decode.decodeValue
(Json.Decode.oneOf
[ Json.Decode.string
, Json.Decode.field "message" Json.Decode.string
]
)
a
)
)
)
--
type ErrorName
= ErrorName String
--
type ErrorCode
= ErrorCode String
--
type ErrorMessage
= ErrorMessage String