| -- Copyright 2020 The Fuchsia Authors. All rights reserved. |
| -- Use of this source code is governed by a BSD-style license that can be |
| -- found in the LICENSE file. |
| |
| |
| module Deployment exposing |
| ( Model |
| , Msg |
| , checkTime |
| , init |
| , initCmd |
| , subscriptions |
| , update |
| , view |
| ) |
| |
| {-| This module produces a view describing the fidlbolt server deployment. |
| |
| This merits its own module because the deployment information is dynamic, and |
| can change from one request to another. |
| |
| -} |
| |
| import DateFormat |
| import DateFormat.Relative as Relative |
| import Html exposing (Html) |
| import Html.Attributes as Attributes |
| import Json.Decode as Decode |
| import Ports |
| import Task |
| import Time |
| |
| |
| |
| ------------- MODEL ------------------------------------------------------------ |
| |
| |
| type alias Model = |
| { deployment : Maybe Deployment |
| , now : Maybe Time.Posix |
| } |
| |
| |
| type alias Deployment = |
| { fidlbolt : Commit |
| , fuchsia : Commit |
| , topaz : Commit |
| , rustfmt : Version |
| } |
| |
| |
| type alias Commit = |
| { hash : String |
| , timestamp : Time.Posix |
| } |
| |
| |
| type alias Version = |
| { version : String |
| } |
| |
| |
| init : Model |
| init = |
| { deployment = Nothing |
| , now = Nothing |
| } |
| |
| |
| initCmd : Cmd Msg |
| initCmd = |
| checkTime |
| |
| |
| |
| ------------- UPDATE ----------------------------------------------------------- |
| |
| |
| type Msg |
| = NoOp |
| | SetDeployment Deployment |
| | SetNow Time.Posix |
| |
| |
| update : Msg -> Model -> Model |
| update msg model = |
| case msg of |
| NoOp -> |
| model |
| |
| SetDeployment deployment -> |
| { model | deployment = Just deployment } |
| |
| SetNow now -> |
| { model | now = Just now } |
| |
| |
| checkTime : Cmd Msg |
| checkTime = |
| Task.perform SetNow Time.now |
| |
| |
| |
| ------------- SUBSCRIPTIONS ---------------------------------------------------- |
| |
| |
| subscriptions : Sub Msg |
| subscriptions = |
| Ports.deploymentUpdated NoOp (Decode.map SetDeployment decodeDeployment) |
| |
| |
| |
| ------------- VIEW ------------------------------------------------------------- |
| |
| |
| view : Model -> Html msg |
| view model = |
| case ( model.deployment, model.now ) of |
| ( Just deployment, Just now ) -> |
| deploymentView deployment now |
| |
| _ -> |
| emptyView |
| |
| |
| emptyView : Html msg |
| emptyView = |
| Html.div [] |
| [ Html.p [] |
| [ Html.text "(No deployment information)" ] |
| ] |
| |
| |
| deploymentView : Deployment -> Time.Posix -> Html msg |
| deploymentView deployment now = |
| let |
| commitView name makeUrl commit = |
| [ Html.text name |
| , Html.text " commit " |
| , Html.a [ Attributes.href (makeUrl commit) ] |
| [ Html.text (String.left 12 commit.hash) ] |
| , Html.text " (" |
| , timestampView now commit.timestamp |
| , Html.text ")" |
| ] |
| in |
| Html.div [] |
| [ Html.p [] |
| [ Html.text "This instance of fidlbolt was built with:" ] |
| , Html.ul [ Attributes.class "close-list" ] |
| [ Html.li [] (commitView "fidlbolt" fidlboltUrl deployment.fidlbolt) |
| , Html.li [] (commitView "fuchsia" fuchsiaUrl deployment.fuchsia) |
| , Html.li [] (commitView "topaz" topazUrl deployment.topaz) |
| , Html.li [] (versionView "rustfmt" rustfmtUrl deployment.rustfmt) |
| ] |
| ] |
| |
| |
| versionView : String -> (Version -> String) -> Version -> List (Html msg) |
| versionView name makeUrl version = |
| [ Html.text name |
| , Html.text " version " |
| , Html.a [ Attributes.href (makeUrl version) ] |
| [ Html.text version.version ] |
| ] |
| |
| |
| timestampView : Time.Posix -> Time.Posix -> Html msg |
| timestampView now timestamp = |
| Html.span |
| [ Attributes.title (formatUtc timestamp) ] |
| [ Html.text (Relative.relativeTime now timestamp) ] |
| |
| |
| formatUtc : Time.Posix -> String |
| formatUtc = |
| DateFormat.format |
| [ DateFormat.monthNameAbbreviated |
| , DateFormat.text " " |
| , DateFormat.dayOfMonthNumber |
| , DateFormat.text ", " |
| , DateFormat.yearNumber |
| , DateFormat.text ", " |
| , DateFormat.hourNumber |
| , DateFormat.text ":" |
| , DateFormat.minuteFixed |
| , DateFormat.text " " |
| , DateFormat.amPmUppercase |
| , DateFormat.text " UTC" |
| ] |
| Time.utc |
| |
| |
| fidlboltUrl : Commit -> String |
| fidlboltUrl commit = |
| "http://fuchsia.googlesource.com/fidlbolt/+/" ++ commit.hash |
| |
| |
| fuchsiaUrl : Commit -> String |
| fuchsiaUrl commit = |
| "http://fuchsia.googlesource.com/fuchsia/+/" ++ commit.hash |
| |
| |
| topazUrl : Commit -> String |
| topazUrl commit = |
| "https://fuchsia.googlesource.com/topaz/+/" ++ commit.hash |
| |
| |
| rustfmtUrl : Version -> String |
| rustfmtUrl version = |
| "https://github.com/rust-lang/rustfmt/releases/tag/v" ++ version.version |
| |
| |
| |
| ------------- ENCODE / DECODE -------------------------------------------------- |
| |
| |
| decodeDeployment : Decode.Decoder Deployment |
| decodeDeployment = |
| Decode.map4 Deployment |
| (Decode.field "fidlbolt" decodeCommit) |
| (Decode.field "fuchsia" decodeCommit) |
| (Decode.field "topaz" decodeCommit) |
| (Decode.field "rustfmt" decodeVersion) |
| |
| |
| decodeCommit : Decode.Decoder Commit |
| decodeCommit = |
| Decode.map2 Commit |
| (Decode.field "hash" Decode.string) |
| (Decode.field "timestamp" decodeTimestamp) |
| |
| |
| decodeTimestamp : Decode.Decoder Time.Posix |
| decodeTimestamp = |
| Decode.map (\t -> Time.millisToPosix (t * 1000)) Decode.int |
| |
| |
| decodeVersion : Decode.Decoder Version |
| decodeVersion = |
| Decode.map Version |
| (Decode.field "version" Decode.string) |