blob: 88c03789944da31c774611c5f564662ebcacab9b [file] [log] [blame]
-- 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.
port module Ports exposing
( applySettings
, clearDataAndReload
, convertToNewSyntax
, deploymentUpdated
, persistModel
, resizeEditors
, setMainTabEnabled
, syntaxDetected
, updateEditors
)
{-| This module defines ports for communicating with JavaScript.
-}
import Json.Decode as Decode
import Json.Encode as Encode
------------- OUTGOING -----------------------------------------------------------
{-| Sends a value to JavaScript. This is the only outgoing port.
-}
port toJS : Encode.Value -> Cmd msg
command : String -> Encode.Value -> Cmd msg
command cmd value =
toJS <|
Encode.object
[ ( "command", Encode.string cmd )
, ( "payload", value )
]
persistModel : Encode.Value -> Cmd msg
persistModel model =
command "persistModel" model
clearDataAndReload : Cmd msg
clearDataAndReload =
command "clearDataAndReload" Encode.null
applySettings : Encode.Value -> Cmd msg
applySettings settings =
command "applySettings" settings
setMainTabEnabled : Bool -> Cmd msg
setMainTabEnabled enabled =
command "setMainTabEnabled" (Encode.bool enabled)
updateEditors : Encode.Value -> Encode.Value -> Encode.Value -> Cmd msg
updateEditors inputMode outputMode options =
command "updateEditors" <|
Encode.object
[ ( "input", inputMode )
, ( "output", outputMode )
, ( "options", options )
]
resizeEditors : Cmd msg
resizeEditors =
command "resizeEditors" Encode.null
convertToNewSyntax : Cmd msg
convertToNewSyntax =
command "convertToNewSyntax" Encode.null
------------- INCOMING ---------------------------------------------------------
{-| Receives a value from JavaScript. This is the only input port.
-}
port fromJS : (Decode.Value -> msg) -> Sub msg
subscribe : String -> msg -> Decode.Decoder msg -> Sub msg
subscribe cmd noOp decodeMsg =
let
decode =
Decode.field "command" Decode.string
|> Decode.andThen
(\passedCmd ->
if passedCmd == cmd then
Decode.field "payload" decodeMsg
else
Decode.fail "Message is not for us"
)
handler value =
case value |> Decode.decodeValue decode of
Err _ ->
noOp
Ok message ->
message
in
fromJS handler
deploymentUpdated : msg -> Decode.Decoder msg -> Sub msg
deploymentUpdated =
subscribe "deploymentUpdated"
syntaxDetected : msg -> Decode.Decoder msg -> Sub msg
syntaxDetected =
subscribe "syntaxDetected"