Try Install Learn Blog API Packages GitHub
Pages

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.