mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-06-22 18:38:26 +00:00
104 lines
2.5 KiB
Elm
104 lines
2.5 KiB
Elm
{-
|
|
Copyright 2020 Eike K. & Contributors
|
|
|
|
SPDX-License-Identifier: AGPL-3.0-or-later
|
|
-}
|
|
|
|
|
|
module Data.ServerEvent exposing (AddonInfo, JobDoneDetails, ServerEvent(..), decode, isAddonExistingItem)
|
|
|
|
import Json.Decode as D
|
|
import Json.Decode.Pipeline as P
|
|
|
|
|
|
type ServerEvent
|
|
= JobSubmitted String
|
|
| JobDone JobDoneDetails
|
|
| JobsWaiting Int
|
|
| AddonInstalled AddonInfo
|
|
|
|
|
|
type alias AddonInfo =
|
|
{ success : Bool
|
|
, addonId : Maybe String
|
|
, addonUrl : Maybe String
|
|
, message : String
|
|
}
|
|
|
|
|
|
type alias JobDoneDetails =
|
|
{ task : String
|
|
, args : Maybe D.Value
|
|
, result : Maybe D.Value
|
|
}
|
|
|
|
|
|
{-| Return wether the job done details belong to running an addon of
|
|
that item with the given id.
|
|
-}
|
|
isAddonExistingItem : String -> JobDoneDetails -> Bool
|
|
isAddonExistingItem itemId details =
|
|
let
|
|
itemIdDecoder =
|
|
D.field "itemId" D.string
|
|
|
|
-- This decodes the structure from scalas ItemAddonTaskArgs (only itemId)
|
|
decodedId =
|
|
Maybe.map (D.decodeValue itemIdDecoder) details.args
|
|
|> Maybe.andThen Result.toMaybe
|
|
in
|
|
details.task
|
|
== "addon-existing-item"
|
|
&& (itemId /= "" && decodedId == Just itemId)
|
|
|
|
|
|
addonInfoDecoder : D.Decoder AddonInfo
|
|
addonInfoDecoder =
|
|
D.succeed AddonInfo
|
|
|> P.required "success" D.bool
|
|
|> P.optional "addonId" (D.maybe D.string) Nothing
|
|
|> P.optional "addonUrl" (D.maybe D.string) Nothing
|
|
|> P.required "message" D.string
|
|
|
|
|
|
decoder : D.Decoder ServerEvent
|
|
decoder =
|
|
D.field "tag" D.string
|
|
|> D.andThen decodeTag
|
|
|
|
|
|
decode : D.Value -> Result String ServerEvent
|
|
decode json =
|
|
D.decodeValue decoder json
|
|
|> Result.mapError D.errorToString
|
|
|
|
|
|
decodeTag : String -> D.Decoder ServerEvent
|
|
decodeTag tag =
|
|
case tag of
|
|
"job-done" ->
|
|
D.field "content" (D.map JobDone decodeJobDoneDetails)
|
|
|
|
"job-submitted" ->
|
|
D.field "content" D.string
|
|
|> D.map JobSubmitted
|
|
|
|
"jobs-waiting" ->
|
|
D.field "content" D.int
|
|
|> D.map JobsWaiting
|
|
|
|
"addon-installed" ->
|
|
D.field "content" addonInfoDecoder
|
|
|> D.map AddonInstalled
|
|
|
|
_ ->
|
|
D.fail ("Unknown tag: " ++ tag)
|
|
|
|
|
|
decodeJobDoneDetails : D.Decoder JobDoneDetails
|
|
decodeJobDoneDetails =
|
|
D.map3 JobDoneDetails
|
|
(D.field "task" D.string)
|
|
(D.field "args" (D.maybe D.value))
|
|
(D.field "result" (D.maybe D.value))
|