2017-07-26 1 views
1

Lorsque vous tentez de décoder des valeurs json plus grandes, j'ai exécuté le code suivant dans la bibliothèque Json-Decode-Extra. (Situé here)Elm Colon Equals Operator

import Date (Date) 

type alias User = 
    { id    : Int 
    , createdAt   : Date 
    , updatedAt   : Date 
    , deletedAt   : Maybe Date 
    , username   : Maybe String 
    , email    : Maybe String 
    , fullname   : Maybe String 
    , avatar   : Maybe String 
    , isModerator  : Bool 
    , isOrganization : Bool 
    , isAdmin   : Bool 
    } 

metaDecoder : (Int -> Date -> Date -> Maybe Date -> b) -> Decoder b 
metaDecoder f = f 
    `map`  ("id"  := int) 
    `apply` ("createdAt" := date) 
    `apply` ("updatedAt" := date) 
    `apply` ("deletedAt" := maybe date) 

userDecoder : Decoder User 
userDecoder = metaDecoder User 
    `apply` ("username"   := maybe string) 
    `apply` ("email"    := maybe string) 
    `apply` ("fullname"   := maybe string) 
    `apply` ("avatar"   := maybe string) 
    `apply` ("isModerator"  := bool) 
    `apply` ("isOrganization" := bool) 
    `apply` ("isAdmin"   := bool) 

Cependant, je suis constamment en cours d'exécution dans une erreur de compilation pour l'opérateur :=. Où est-ce défini? Les didacticiels de décodage JSON n'importent pas explicitement cet opérateur n'importe où.

Répondre

5

Dans Elm 0.18, l'opérateur := a été remplacé par Json.Decode.field et l'utilisation des guillemets pour les opérateurs infixes a été supprimée.

Vous utilisez un package (circuithub/elm-json-extra) qui n'a pas été mis à jour vers Elm 0.18.

Envisagez d'utiliser le package géré par la communauté Elm: elm-community/json-extra. Vous pouvez utiliser andMap au lieu de apply. Voici votre code d'exemple à la nouvelle bibliothèque et Elm 0,18:

import Date exposing (Date) 
import Json.Decode exposing (..) 
import Json.Decode.Extra exposing (andMap, date) 

metaDecoder : (Int -> Date -> Date -> Maybe Date -> b) -> Decoder b 
metaDecoder f = 
    succeed f 
     |> andMap (field "id" int) 
     |> andMap (field "createdAt" date) 
     |> andMap (field "updatedAt" date) 
     |> andMap (field "deletedAt" (maybe date)) 

userDecoder : Decoder User 
userDecoder = 
    metaDecoder User 
     |> andMap (field "username" (maybe string)) 
     |> andMap (field "email" (maybe string)) 
     |> andMap (field "fullname" (maybe string)) 
     |> andMap (field "avatar" (maybe string)) 
     |> andMap (field "isModerator" bool) 
     |> andMap (field "isOrganization" bool) 
     |> andMap (field "isAdmin" bool) 

Notez que le paquet elm-community/json-extra exporte également un opérateur infixe |: qui est une version infixe de andMap. Vous pouvez l'utiliser pour rendre votre code plus concis. Par exemple:

metaDecoder : (Int -> Date -> Date -> Maybe Date -> b) -> Decoder b 
metaDecoder f = 
    succeed f 
     |: field "id" int 
     |: field "createdAt" date 
     |: field "updatedAt" date 
     |: field "deletedAt" (maybe date)