Skip to content
This repository was archived by the owner on Feb 6, 2020. It is now read-only.

Latest commit

 

History

History
89 lines (65 loc) · 2.09 KB

File metadata and controls

89 lines (65 loc) · 2.09 KB

Decoding Objects

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, ...), which can be used in a try expression.

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.

{% hint style="info" %} 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. {% endhint %}

An example of decoding a simple record:

record User {
  name : String,
  age : Number
}

component Main {
  fun render : Html {
    try {
      object =
        Json.parse("{\"name\": \"John\", \"age\": 30 }")
        |> Maybe.toResult("Decode Error")

      user =
        decode object as User

      (<div>
        <{ user.name }>
      </div>)
    } catch Object.Error => error {
      <div><{ "Could not decode!" }></div>
    } catch String => error {
      <div><{ "Invalid JSON!" }></div>
    }
  }
}

In this case, user is a Result(Object.Error, User).

Decoding not supported names

There are times when we want to decode a key from an object into a record whats name is not supported as a record key for example tag_list. In this case we can use the using keyword 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.