-
Notifications
You must be signed in to change notification settings - Fork 0
/
LandingPage.elm
132 lines (95 loc) · 2.92 KB
/
LandingPage.elm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
port module Main exposing (..)
import Date exposing (Date)
import Dict exposing (Dict)
import Html exposing (Html)
import Html.App
import Json.Encode as Json
import Json.Decode as Decode
import String
type alias Model =
{ localInfo : Maybe ZipcodeInfo }
type alias ZipcodeInfo =
{ policeChief : PersonInfo
, mayor : PersonInfo
}
zipcodeInfoDecoder : Decode.Decoder ZipcodeInfo
zipcodeInfoDecoder =
Decode.object2 ZipcodeInfo
(Decode.at [ "policeChief" ] personInfoDecoder)
(Decode.at [ "mayor" ] personInfoDecoder)
type alias PersonInfo =
{ name : Maybe String
, terms : List TermInfo
}
personInfoDecoder : Decode.Decoder PersonInfo
personInfoDecoder =
Decode.object2 PersonInfo
(Decode.at [ "name" ] (Decode.maybe Decode.string))
(Decode.oneOf
[ Decode.at [ "terms" ] (Decode.dict termInfoDecoder)
, Decode.succeed (Dict.empty)
]
|> Decode.map Dict.toList
|> Decode.map (List.map snd)
)
type alias TermInfo =
{ start : Month
, end : Maybe Month
}
termInfoDecoder : Decode.Decoder TermInfo
termInfoDecoder =
Decode.object2 TermInfo
(Decode.at [ "start" ] decodeMonth)
(Decode.oneOf
[ Decode.at [ "end" ] (Decode.maybe decodeMonth)
, Decode.succeed Nothing
]
)
type alias Month =
{ year : Int
, month : Int
}
decodeMonth : Decode.Decoder Month
decodeMonth =
Decode.customDecoder Decode.string
(\dateString ->
case String.split "-" dateString of
[ yearString, monthString ] ->
case ( String.toInt yearString, String.toInt monthString ) of
( Ok year, Ok month ) ->
Ok (Month year month)
_ ->
Err ("Expected a month, but got " ++ dateString)
_ ->
Err ("Expected a month, but got " ++ dateString)
)
initialModel : Model
initialModel =
{ localInfo = Nothing }
type Msg
= GotZipcodeData Json.Value
decodeZipcodeData : Json.Value -> Maybe ZipcodeInfo
decodeZipcodeData json =
Decode.decodeValue zipcodeInfoDecoder json
|> Result.formatError (Debug.log "decoding error")
|> Result.toMaybe
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case Debug.log "update" msg of
GotZipcodeData json ->
( { model | localInfo = decodeZipcodeData json }
, Cmd.none
)
view : Model -> Html msg
view model =
Html.text <| toString model
port changeZipcode : String -> Cmd msg
port zipcodeData : (Json.Value -> msg) -> Sub msg
main : Program Never
main =
Html.App.program
{ init = ( initialModel, changeZipcode "94107" )
, update = update
, subscriptions = \_ -> zipcodeData GotZipcodeData
, view = view
}