@@ -0,0 +1,161 @@
1+module Deployments exposing (..)
2+
3+import Json.Decode as Decoder exposing (Decoder, string, andThen)
4+import Json.Decode.Extra exposing (datetime)
5+import Json.Decode.Pipeline exposing (required, optional, resolve)
6+import Time
7+import Route exposing (Route(..))
8+
9+
10+type OverrideValue
11+ = ValueAdded String
12+ | ValueDeleted
13+
14+type alias Override =
15+ { name : String
16+ , value : OverrideValue }
17+
18+type alias Info =
19+ { name : String
20+ , appOverrides : List Override
21+ , deploymentOverrides : List Override
22+ }
23+
24+type alias Metadata =
25+ { name : String
26+ , link : String
27+ }
28+
29+type alias Deployment =
30+ { deployment : Info
31+ , status : Status
32+ , metadata : List Metadata
33+ , createdAt : Time.Posix
34+ , updatedAt : Time.Posix }
35+
36+type DeploymentStatus
37+ = Running
38+ | Failure FailureType
39+ | CreatePending
40+ | UpdatePending
41+ | ArchivePending
42+ | Archived
43+ | CleanupFailed
44+
45+type FailureType
46+ = GenericFailure
47+ | TagMismatch
48+ | PartialAvailability
49+
50+type Status
51+ = DeploymentPending DeploymentStatus
52+ | DeploymentNotPending DeploymentStatus
53+
54+
55+type alias Deployments = List Deployment
56+
57+failureTypeDecoder : Decoder FailureType
58+failureTypeDecoder =
59+ let
60+ tagDecoder tag = case tag of
61+ "GenericFailure" -> Decoder.succeed GenericFailure
62+ "PartialAvailability" -> Decoder.succeed PartialAvailability
63+ "TagMismatch" -> Decoder.succeed TagMismatch
64+ _ -> Decoder.fail ("Unknown FailureType: " ++ tag)
65+ in
66+ string |> andThen tagDecoder
67+
68+deploymentStatusDecoder : Decoder DeploymentStatus
69+deploymentStatusDecoder =
70+ let
71+ toDecoder : String -> Maybe FailureType -> Decoder DeploymentStatus
72+ toDecoder tag contents =
73+ case (tag, contents) of
74+ ("Running", _) -> Decoder.succeed Running
75+ ("CreatePending", _) -> Decoder.succeed CreatePending
76+ ("UpdatePending", _) -> Decoder.succeed UpdatePending
77+ ("ArchivePending", _) -> Decoder.succeed ArchivePending
78+ ("Archived", _) -> Decoder.succeed Archived
79+ ("CleanupFailed", _) -> Decoder.succeed CleanupFailed
80+ ("Failure", Just failureType) -> Decoder.succeed (Failure failureType)
81+ (_,_) -> Decoder.fail ("Unknown DeploymentStatus: " ++ tag)
82+ in
83+ Decoder.succeed toDecoder
84+ |> required "tag" string
85+ |> optional "contents" (Decoder.maybe failureTypeDecoder) Nothing
86+ |> resolve
87+
88+statusDecoder : Decoder Status
89+statusDecoder =
90+ let
91+ toDecoder : String -> DeploymentStatus -> Decoder Status
92+ toDecoder tag contents =
93+ case tag of
94+ "DeploymentNotPending" -> Decoder.succeed (DeploymentNotPending contents)
95+ "DeploymentPending" -> Decoder.succeed (DeploymentPending contents)
96+ _ -> Decoder.fail ("Unknown Status: " ++ tag)
97+ in
98+ Decoder.succeed toDecoder
99+ |> required "tag" string
100+ |> required "recorded_status" deploymentStatusDecoder
101+ |> resolve
102+
103+metadataDecoder : Decoder Metadata
104+metadataDecoder =
105+ Decoder.succeed Metadata
106+ |> required "name" string
107+ |> required "link" string
108+
109+overrideValueDecoder : Decoder OverrideValue
110+overrideValueDecoder =
111+ let
112+ toDecoder : String -> Maybe String -> Decoder OverrideValue
113+ toDecoder tag contents =
114+ case (tag, contents) of
115+ ("ValueDeleted", _) -> Decoder.succeed ValueDeleted
116+ ("ValueAdded", Just value) -> Decoder.succeed (ValueAdded value)
117+ (_,_) -> Decoder.fail ("Unknown DeploymentStatus: " ++ tag)
118+ in
119+ Decoder.succeed toDecoder
120+ |> required "tag" string
121+ |> optional "contents" (Decoder.maybe string) Nothing
122+ |> resolve
123+
124+type OverrideHelper
125+ = OverrideName String
126+ | OverrideValue OverrideValue
127+
128+
129+
130+overrideDecoder : Decoder Override
131+overrideDecoder =
132+ let
133+ overrideHelperDecoder = Decoder.list (Decoder.oneOf
134+ [ string |> Decoder.map OverrideName
135+ , overrideValueDecoder |> Decoder.map OverrideValue
136+ ])
137+ listDecoder vals = case vals of
138+ [OverrideName name, OverrideValue val] -> Decoder.succeed (Override name val)
139+ [OverrideValue val, OverrideName name] -> Decoder.succeed (Override name val)
140+ _ -> Decoder.fail ("Unknown override")
141+ in
142+ overrideHelperDecoder |> andThen listDecoder
143+
144+infoDecoder : Decoder Info
145+infoDecoder =
146+ Decoder.succeed Info
147+ |> required "name" string
148+ |> required "app_overrides" (Decoder.list overrideDecoder)
149+ |> required "deployment_overrides" (Decoder.list overrideDecoder)
150+
151+deploymentDecoder : Decoder Deployment
152+deploymentDecoder =
153+ Decoder.succeed Deployment
154+ |> required "deployment" infoDecoder
155+ |> required "status" statusDecoder
156+ |> required "metadata" (Decoder.list metadataDecoder)
157+ |> required "created_at" datetime
158+ |> required "updated_at" datetime
159+
160+deploymentsDecoder : Decoder Deployments
161+deploymentsDecoder = Decoder.list deploymentDecoder