ohenecoker
ohenecoker

Reputation: 81

Elm Json Decoder Pipeline error

I'm trying to decode some json coming in from an http request but I keep running into syntax issues. This is the error I get from the compiler:

-- TYPE MISMATCH ------------------------------------------------------ [7/1811$

The 2nd argument to function `send` is causing a mismatch.

65|     Http.send CardFetch (Http.get url modelDecoder)
                             ^^^^^^^^^^^^^^^^^^^^^^^^^
Function `send` is expecting the 2nd argument to be:

    Http.Request String

But it is:

    Http.Request Model

Here is my code:

module Main exposing (..)

import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (..)
import Http
import Json.Decode as Decode exposing (string, Decoder, at, index)
import Json.Decode.Pipeline exposing (..)


main : Program Never Model Msg
main =
    program
        { init = init
        , view = view
        , update = update
        , subscriptions = subscriptions
        }


type alias Model =
    { boardName : String
    , cardName : String
    }


init =
    ( Model "Default Board" "Default Card"
    , Cmd.none
    )



-- UPDATE


type Msg
    = CardFetch (Result Http.Error String)
    | DataFetch


update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
    case msg of
        DataFetch ->
            ( model, getData )

        CardFetch (Ok incomingName) ->
            ( Model model.cardName incomingName, Cmd.none )

        CardFetch (Err errorMessage) ->
            ( model, Debug.log "Errors" Cmd.none )



-- HTTP


url : String
url =
    "https://api.trello.com/1/members/user/actions?limit=3&key=..."


getData =
    Http.send CardFetch (Http.get url modelDecoder)



{--decodeCard =
    Decode.index 0
        modelDecoder
        (Decode.at
            [ "data", "card", "name" ]
            string
        )
        --}


modelDecoder : Decoder Model
modelDecoder =
    decode Model
        |> custom (index 0 (at [ "data", "card", "name" ] string))
        |> custom (index 0 (at [ "data", "board", "name" ] string))



--UPDATE
-- VIEW


view : Model -> Html Msg
view model =
    div []
        [ div []
            [ button [ onClick DataFetch ] [ text "Get Card" ] ]
        , div [ class "card" ]
            [ h3 [] [ text model.boardName ]
            , div [ class "board" ] [ h4 [] [ text model.cardName ] ]
            ]
        ]



-- SUBSCRIPTIONS


subscriptions : Model -> Sub Msg
subscriptions model =
    Sub.none

I'm am fairly new to Elm and I'm trying to figure out how API calls work. Elm documentation is excellent but the bit about API calls is kind of vague. I would appreciate any help I can get. Thanks a lot!

Upvotes: 1

Views: 321

Answers (1)

daniula
daniula

Reputation: 7028

You declared in your messages:

CardFetch (Result Http.Error String)

which means that successful response will produce String. However, your modelDecoder is returning Model: modelDecoder : Decoder Model.

Changing your message declaration to:

CardFetch (Result Http.Error Model)

and in update function:

CardFetch (Ok incomingName) ->
    ( incomingName, Cmd.none )

should help.

Upvotes: 4

Related Questions