Skip to content

Instantly share code, notes, and snippets.

@svoynow
Created September 13, 2018 01:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save svoynow/81ac5bd6d07dccbec534bc92ac2a4a40 to your computer and use it in GitHub Desktop.
Save svoynow/81ac5bd6d07dccbec534bc92ac2a4a40 to your computer and use it in GitHub Desktop.
decoding an array
type userId = string;
type gameId = string;
type screenName = string
type player = {
userId,
screenName
};
type serverGameState =
| Waiting
| Started;
type serverGame = {
id: gameId,
owner: player,
players: array(player),
state: serverGameState
};
type serverGames = array(serverGame);
type gamesUpdate = {
games: serverGames
}
module Decode = {
let player = (json) =>
Json.Decode.(
{
userId: json |> field("user_id", string),
screenName: json |> field("screen_name", string)
}
);
let gameState =
fun
| "waiting" => Waiting
| "started" => Started
| _ => Waiting;
let serverGame = (json) =>
Json.Decode.(
{
id: json |> field("id", string),
owner: json |> field("owner", player),
players: json |> array(field("players", player)),
state: json |> field("state", string) |> gameState
}
);
let gamesUpdate = (json) => {
Js.log(Js.Json.stringify(json));
/* {"games":[{"state":"waiting","players":[{"user_id":"hello","screen_name":"screeeen"}],"owner":{"user_id":"hello","screen_name":"screeeen"},"id":"this_is_a_game"}]} */
Json.Decode.(
{ games: json |> field("games", array(serverGame)) }
)
}
}
/*
"Expected array, got {"state":"waiting","players":[{"user_id":"hello","screen_name":"screeeen"}],"owner":{"user_id":"hello","screen_name":"screeeen"},"id":"this_is_a_game"}
in array at index 0
at field 'games'"
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment