Decode Expression
In order to process data from JavaScript in Mint, you must convert it from JavaScript:
-
object
{ name: "Joe" }
-
array
[1, 2, 3]
-
number
0
-
string
"Joe"
-
null
-
undefined
...to a Mint typed value.
The
decode
expression:
decode object as String
...will try to convert the untyped value to a typed value. It returns a
Result(Object.Error, ...)
You can decode JavaScript values into Mint
primitive values
(
String
,
Bool
,
Number
,
Time
)
simple structures
(
Maybe(a)
,
Set(a)
,
Map(a,b)
,
Array(a)
) and
records
which only have
decodable values.
If you try to decode a type which is not supported or try to decode
something that is not an
Object
, you will get a nice error message.
An example of decoding a simple record:
record User {
name : String,
age : Number
}
component Main {
fun render : Html {
case Json.parse("{\"name\": \"John\", \"age\": 30 }") {
Result::Err => <div>"Can't parse JSON"</div>
Result::Ok(object) =>
case decode object as User {
Result::Err => <div>"Can't decode User"</div>
Result::Ok(user) =>
<div>
<{ user.name }>
</div>
}
}
}
}
Decoding not supported names
There are times when we want to decode an object containing a key whose
name is not a valid record key, for example
tag_list
. In this case the
using
keyword can be used to specify the mapping between the object and the record.
Here is an example:
record Post {
tagList: Array(String) using "tag_list"
}
When decoding an object as a
Post
it will look for the
tag_list
field instead of the
tagList
field in the object, so this JavaScript Object:
{
tag_list: ["a", "b"]
}
will decode into this record:
{
tagList: ["a", "b"]
}
...it will use this key for the encoding as well.