show service by id

This commit is contained in:
DieMyst 2020-11-30 16:33:24 +03:00
parent a9c739c0b1
commit 2f192bd97c
6 changed files with 143 additions and 115 deletions

View File

@ -15,6 +15,7 @@ toInstance peerId identify blueprints service =
let let
name = name =
blueprints |> Dict.get service.blueprint_id |> Maybe.withDefault "unknown" blueprints |> Dict.get service.blueprint_id |> Maybe.withDefault "unknown"
ip = ip =
List.head identify.external_addresses |> Maybe.withDefault "unknown" List.head identify.external_addresses |> Maybe.withDefault "unknown"
in in
@ -32,8 +33,11 @@ view model =
instances = instances =
Dict.toList model.discoveredPeers Dict.toList model.discoveredPeers
|> List.map (\( peer, data ) -> data.services |> List.map
|> List.map (toInstance peer data.identify bpsDict)) (\( peer, data ) ->
data.services
|> List.map (toInstance peer data.identify bpsDict)
)
|> List.concat |> List.concat
in in
viewTable instances viewTable instances
@ -42,7 +46,7 @@ view model =
viewTable : List Instance -> Html msg viewTable : List Instance -> Html msg
viewTable instances = viewTable instances =
div [ classes "pa4" ] div [ classes "pa4" ]
[ div [ classes "overflow-auto" ] [ div [ classes "" ]
[ table [ classes "f6 w-100 mw8 center", attribute "cellspacing" "0" ] [ table [ classes "f6 w-100 mw8 center", attribute "cellspacing" "0" ]
[ thead [] [ thead []
[ tr [ classes "stripe-dark" ] [ tr [ classes "stripe-dark" ]

View File

@ -1,14 +0,0 @@
module ModulePage.Model exposing (..)
import Services.Model exposing (Service)
type alias ModuleInfo =
{ name : String
, id : String
, author : String
, authorPeerId : String
, description : String
, website : String
, service : Service
}

View File

@ -1,68 +0,0 @@
module ModulePage.View exposing (..)
import Html exposing (Html, article, div, span, text)
import ModulePage.Model exposing (ModuleInfo)
import Palette exposing (classes)
import Services.Model exposing (Record, Signature)
import String.Interpolate exposing (interpolate)
view : ModuleInfo -> Html msg
view moduleInfo =
div [ classes "cf ph2-ns" ]
[ span [ classes "fl w-100 f1 lh-title dark-red" ] [ text ("Module: " ++ moduleInfo.name) ]
, span [ classes "fl w-100 light-red" ] [ text moduleInfo.id ]
, viewInfo moduleInfo
]
viewInfo : ModuleInfo -> Html msg
viewInfo moduleInfo =
article [ classes "cf" ]
[ div [ classes "fl w-30 gray mv1" ] [ text "AUTHOR" ]
, div [ classes "fl w-70 mv1" ] [ span [ classes "fl w-100 black b" ] [ text moduleInfo.author ], span [ classes "fl w-100 black" ] [ text moduleInfo.authorPeerId ] ]
, div [ classes "fl w-30 gray mv1" ] [ text "DESCRIPTION" ]
, div [ classes "fl w-70 mv1" ] [ span [ classes "fl w-100 black" ] [ text moduleInfo.description ] ]
, div [ classes "fl w-30 gray mv1" ] [ text "INTERFACE" ]
, div [ classes "fl w-70 mv1" ] [ span [ classes "fl w-100 black" ] (recordsView moduleInfo.service.interface.record_types ++ signaturesView moduleInfo.service.interface.function_signatures) ]
]
recordsView : List Record -> List (Html msg)
recordsView record =
List.map recordView record
recordView : Record -> Html msg
recordView record =
div [ classes "i" ]
([ span [ classes "fl w-100 mt2" ] [ text (record.name ++ " {") ] ]
++ fieldsView record.fields
++ [ span [ classes "fl w-100 mb2" ] [ text "}" ] ]
)
fieldsView : List (List String) -> List (Html msg)
fieldsView fields =
fields |> List.map (\f -> span [ classes "fl w-100 ml2" ] [ text (String.join ": " f) ])
signaturesView : List Signature -> List (Html msg)
signaturesView signatures =
List.map signatureView signatures
signatureView : Signature -> Html msg
signatureView signature =
div [ classes "i fl w-100 mv2" ]
[ text (interpolate "fn {0}({1}) -> {2}" [ signature.name, argumentsToString signature.arguments, outputToString signature.output_types ]) ]
argumentsToString : List (List String) -> String
argumentsToString arguments =
String.join ", " (arguments |> List.map (String.join ": "))
outputToString : List String -> String
outputToString output =
output |> List.head |> Maybe.withDefault "void"

View File

@ -2,12 +2,12 @@ module Route exposing (..)
import Air exposing (callBI, fold, next, par, relayEvent, seq, set) import Air exposing (callBI, fold, next, par, relayEvent, seq, set)
import Dict import Dict
import Html exposing (Html) import Html exposing (Html, text)
import HubPage.View as HubPage import HubPage.View as HubPage
import Json.Encode as Encode import Json.Encode as Encode
import Model exposing (Model, Route(..)) import Model exposing (Model, Route(..))
import ModulePage.View as ModulePage
import Port exposing (sendAir) import Port exposing (sendAir)
import ServicePage.View as ServicePage
import Url.Parser exposing ((</>), Parser, map, oneOf, s, string) import Url.Parser exposing ((</>), Parser, map, oneOf, s, string)
@ -37,39 +37,16 @@ routeView model route =
HubPage.view model HubPage.view model
_ -> _ ->
Html.text ("undefined page: " ++ page) text ("undefined page: " ++ page)
Peer peer -> Peer peer ->
Html.text peer text peer
Service serviceId -> Service serviceId ->
Html.text serviceId ServicePage.view model serviceId
Module moduleName -> Module moduleName ->
let text moduleName
up =
\( pid, p ) -> Maybe.map (\a -> Tuple.pair pid a) (List.head (List.drop 0 p.services))
el =
List.head (List.drop 2 (Dict.toList model.discoveredPeers))
in
case Maybe.andThen up el of
Just ( peerId, service ) ->
let
example =
{ name = moduleName
, id = service.service_id
, author = "Fluence Labs"
, authorPeerId = peerId
, description = "Cool service"
, website = "https://github.com/fluencelabs/chat"
, service = service
}
in
ModulePage.view example
Nothing ->
Html.text moduleName
getPeers : Model -> Cmd msg getPeers : Model -> Cmd msg

View File

@ -1 +1,14 @@
module ServicePage.Model exposing (..) module ServicePage.Model exposing (..)
import Services.Model exposing (Service)
type alias ServiceInfo =
{ name : String
, id : String
, author : String
, authorPeerId : String
, description : String
, website : String
, service : Service
}

View File

@ -1 +1,117 @@
module ServicePage.View exposing (..) module ServicePage.View exposing (..)
import Dict
import Html exposing (Html, article, div, span, text)
import List.Extra
import Model exposing (Model)
import Palette exposing (classes)
import ServicePage.Model exposing (ServiceInfo)
import Services.Model exposing (Record, Signature)
import String.Interpolate exposing (interpolate)
view : Model -> String -> Html msg
view model id =
let
moduleInfo =
modelToServiceInfo model id
in
case moduleInfo of
Just mi ->
div [ classes "cf ph2-ns" ]
[ span [ classes "fl w-100 f1 lh-title dark-red" ] [ text ("Module: " ++ mi.name) ]
, span [ classes "fl w-100 light-red" ] [ text mi.id ]
, viewInfo mi
]
Nothing ->
div [ classes "cf ph2-ns" ]
[ span [ classes "fl w-100 f1 lh-title dark-red" ] [ text "Module not found" ]
]
modelToServiceInfo : Model -> String -> Maybe ServiceInfo
modelToServiceInfo model id =
let
datas =
Dict.toList model.discoveredPeers
services =
datas |> List.map (\( peer, data ) -> data.services |> List.map (\s -> ( peer, s ))) |> List.concat
blueprints =
datas |> List.map (\( _, data ) -> data.blueprints) |> List.concat |> List.map (\bp -> ( bp.id, bp.name )) |> Dict.fromList
service =
services |> List.Extra.find (\( _, s ) -> s.service_id == id)
name =
service |> Maybe.andThen (\( _, s ) -> blueprints |> Dict.get s.blueprint_id) |> Maybe.withDefault "unknown"
info =
service
|> Maybe.map
(\( p, s ) ->
{ name = name
, id = id
, author = "Fluence Labs"
, authorPeerId = p
, description = "Cool service"
, website = "https://github.com/fluencelabs/chat"
, service = s
}
)
in
info
viewInfo : ServiceInfo -> Html msg
viewInfo moduleInfo =
article [ classes "cf" ]
[ div [ classes "fl w-30 gray mv1" ] [ text "AUTHOR" ]
, div [ classes "fl w-70 mv1" ] [ span [ classes "fl w-100 black b" ] [ text moduleInfo.author ], span [ classes "fl w-100 black" ] [ text moduleInfo.authorPeerId ] ]
, div [ classes "fl w-30 gray mv1" ] [ text "DESCRIPTION" ]
, div [ classes "fl w-70 mv1" ] [ span [ classes "fl w-100 black" ] [ text moduleInfo.description ] ]
, div [ classes "fl w-30 gray mv1" ] [ text "INTERFACE" ]
, div [ classes "fl w-70 mv1" ] [ span [ classes "fl w-100 black" ] (recordsView moduleInfo.service.interface.record_types ++ signaturesView moduleInfo.service.interface.function_signatures) ]
]
recordsView : List Record -> List (Html msg)
recordsView record =
List.map recordView record
recordView : Record -> Html msg
recordView record =
div [ classes "i" ]
([ span [ classes "fl w-100 mt2" ] [ text (record.name ++ " {") ] ]
++ fieldsView record.fields
++ [ span [ classes "fl w-100 mb2" ] [ text "}" ] ]
)
fieldsView : List (List String) -> List (Html msg)
fieldsView fields =
fields |> List.map (\f -> span [ classes "fl w-100 ml2" ] [ text (String.join ": " f) ])
signaturesView : List Signature -> List (Html msg)
signaturesView signatures =
List.map signatureView signatures
signatureView : Signature -> Html msg
signatureView signature =
div [ classes "i fl w-100 mv2" ]
[ text (interpolate "fn {0}({1}) -> {2}" [ signature.name, argumentsToString signature.arguments, outputToString signature.output_types ]) ]
argumentsToString : List (List String) -> String
argumentsToString arguments =
String.join ", " (arguments |> List.map (String.join ": "))
outputToString : List String -> String
outputToString output =
output |> List.head |> Maybe.withDefault "void"