{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DerivingStrategies #-}

module WebDriverPreCore.BiDi.WebExtensions
  ( WebExtensionID (..),
    WebExtensionInstall (..),
    WebExtensionUninstall (..),
    WebExtensionResult (..),
  )
where

import Data.Aeson (FromJSON, ToJSON (..), Value, object, (.=))
import Data.Text (Text)
import GHC.Generics (Generic)

{- prompt
create types to represent the remote end for storage as prer the cddl in this file:

1. preface singleton data constructors (ie the constructor for types with only one type constructor) with Mk
2. use newtypes where possible
3. ordering - order types such that types that are used by a type are declared immediately below that type in the order they are used
4. derive Show, Eq and Generic for all types
5. use Text rather than String
5. use the cddl in this file remote first under the -- ######### Remote ######### header
7. Avoid using Parameters suffix in type and data constructor names
8. leave this comment at the top of the file
-}

-- ######### Remote #########

-- WebExtension type
newtype WebExtensionID = MkWebExtensionID Text
  deriving newtype (Int -> WebExtensionID -> ShowS
[WebExtensionID] -> ShowS
WebExtensionID -> String
(Int -> WebExtensionID -> ShowS)
-> (WebExtensionID -> String)
-> ([WebExtensionID] -> ShowS)
-> Show WebExtensionID
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> WebExtensionID -> ShowS
showsPrec :: Int -> WebExtensionID -> ShowS
$cshow :: WebExtensionID -> String
show :: WebExtensionID -> String
$cshowList :: [WebExtensionID] -> ShowS
showList :: [WebExtensionID] -> ShowS
Show, WebExtensionID -> WebExtensionID -> Bool
(WebExtensionID -> WebExtensionID -> Bool)
-> (WebExtensionID -> WebExtensionID -> Bool) -> Eq WebExtensionID
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: WebExtensionID -> WebExtensionID -> Bool
== :: WebExtensionID -> WebExtensionID -> Bool
$c/= :: WebExtensionID -> WebExtensionID -> Bool
/= :: WebExtensionID -> WebExtensionID -> Bool
Eq, Maybe WebExtensionID
Value -> Parser [WebExtensionID]
Value -> Parser WebExtensionID
(Value -> Parser WebExtensionID)
-> (Value -> Parser [WebExtensionID])
-> Maybe WebExtensionID
-> FromJSON WebExtensionID
forall a.
(Value -> Parser a)
-> (Value -> Parser [a]) -> Maybe a -> FromJSON a
$cparseJSON :: Value -> Parser WebExtensionID
parseJSON :: Value -> Parser WebExtensionID
$cparseJSONList :: Value -> Parser [WebExtensionID]
parseJSONList :: Value -> Parser [WebExtensionID]
$comittedField :: Maybe WebExtensionID
omittedField :: Maybe WebExtensionID
FromJSON, [WebExtensionID] -> Value
[WebExtensionID] -> Encoding
WebExtensionID -> Bool
WebExtensionID -> Value
WebExtensionID -> Encoding
(WebExtensionID -> Value)
-> (WebExtensionID -> Encoding)
-> ([WebExtensionID] -> Value)
-> ([WebExtensionID] -> Encoding)
-> (WebExtensionID -> Bool)
-> ToJSON WebExtensionID
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
$ctoJSON :: WebExtensionID -> Value
toJSON :: WebExtensionID -> Value
$ctoEncoding :: WebExtensionID -> Encoding
toEncoding :: WebExtensionID -> Encoding
$ctoJSONList :: [WebExtensionID] -> Value
toJSONList :: [WebExtensionID] -> Value
$ctoEncodingList :: [WebExtensionID] -> Encoding
toEncodingList :: [WebExtensionID] -> Encoding
$comitField :: WebExtensionID -> Bool
omitField :: WebExtensionID -> Bool
ToJSON)



-- ExtensionData represents different ways to provide extension data
data WebExtensionInstall
  = ExtensionPath Text
  | ExtensionArchivePath Text
  | ExtensionBase64Encoded Text
  deriving (Int -> WebExtensionInstall -> ShowS
[WebExtensionInstall] -> ShowS
WebExtensionInstall -> String
(Int -> WebExtensionInstall -> ShowS)
-> (WebExtensionInstall -> String)
-> ([WebExtensionInstall] -> ShowS)
-> Show WebExtensionInstall
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> WebExtensionInstall -> ShowS
showsPrec :: Int -> WebExtensionInstall -> ShowS
$cshow :: WebExtensionInstall -> String
show :: WebExtensionInstall -> String
$cshowList :: [WebExtensionInstall] -> ShowS
showList :: [WebExtensionInstall] -> ShowS
Show, WebExtensionInstall -> WebExtensionInstall -> Bool
(WebExtensionInstall -> WebExtensionInstall -> Bool)
-> (WebExtensionInstall -> WebExtensionInstall -> Bool)
-> Eq WebExtensionInstall
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: WebExtensionInstall -> WebExtensionInstall -> Bool
== :: WebExtensionInstall -> WebExtensionInstall -> Bool
$c/= :: WebExtensionInstall -> WebExtensionInstall -> Bool
/= :: WebExtensionInstall -> WebExtensionInstall -> Bool
Eq, (forall x. WebExtensionInstall -> Rep WebExtensionInstall x)
-> (forall x. Rep WebExtensionInstall x -> WebExtensionInstall)
-> Generic WebExtensionInstall
forall x. Rep WebExtensionInstall x -> WebExtensionInstall
forall x. WebExtensionInstall -> Rep WebExtensionInstall x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. WebExtensionInstall -> Rep WebExtensionInstall x
from :: forall x. WebExtensionInstall -> Rep WebExtensionInstall x
$cto :: forall x. Rep WebExtensionInstall x -> WebExtensionInstall
to :: forall x. Rep WebExtensionInstall x -> WebExtensionInstall
Generic)

instance ToJSON WebExtensionInstall where
  toJSON :: WebExtensionInstall -> Value
  toJSON :: WebExtensionInstall -> Value
toJSON WebExtensionInstall
ex =
    [Pair] -> Value
object
      [ Key
"extensionData" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Value
extensionData
      ]
    where
      extensionData :: Value
extensionData = case WebExtensionInstall
ex of
        ExtensionPath Text
path ->
          [Pair] -> Value
object
            [ Key
"type" Key -> String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= String
"path",
              Key
"path" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text
path
            ]
        ExtensionArchivePath Text
path ->
          [Pair] -> Value
object
            [ Key
"type" Key -> String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= String
"archivePath",
              Key
"path" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text
path
            ]
        ExtensionBase64Encoded Text
value ->
          [Pair] -> Value
object
            [ Key
"type" Key -> String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= String
"base64",
              Key
"value" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text
value
            ]

newtype WebExtensionUninstall = MkWebExtensionUninstall
  { WebExtensionUninstall -> WebExtensionID
extension :: WebExtensionID
  }
  deriving (Int -> WebExtensionUninstall -> ShowS
[WebExtensionUninstall] -> ShowS
WebExtensionUninstall -> String
(Int -> WebExtensionUninstall -> ShowS)
-> (WebExtensionUninstall -> String)
-> ([WebExtensionUninstall] -> ShowS)
-> Show WebExtensionUninstall
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> WebExtensionUninstall -> ShowS
showsPrec :: Int -> WebExtensionUninstall -> ShowS
$cshow :: WebExtensionUninstall -> String
show :: WebExtensionUninstall -> String
$cshowList :: [WebExtensionUninstall] -> ShowS
showList :: [WebExtensionUninstall] -> ShowS
Show, WebExtensionUninstall -> WebExtensionUninstall -> Bool
(WebExtensionUninstall -> WebExtensionUninstall -> Bool)
-> (WebExtensionUninstall -> WebExtensionUninstall -> Bool)
-> Eq WebExtensionUninstall
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: WebExtensionUninstall -> WebExtensionUninstall -> Bool
== :: WebExtensionUninstall -> WebExtensionUninstall -> Bool
$c/= :: WebExtensionUninstall -> WebExtensionUninstall -> Bool
/= :: WebExtensionUninstall -> WebExtensionUninstall -> Bool
Eq, (forall x. WebExtensionUninstall -> Rep WebExtensionUninstall x)
-> (forall x. Rep WebExtensionUninstall x -> WebExtensionUninstall)
-> Generic WebExtensionUninstall
forall x. Rep WebExtensionUninstall x -> WebExtensionUninstall
forall x. WebExtensionUninstall -> Rep WebExtensionUninstall x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. WebExtensionUninstall -> Rep WebExtensionUninstall x
from :: forall x. WebExtensionUninstall -> Rep WebExtensionUninstall x
$cto :: forall x. Rep WebExtensionUninstall x -> WebExtensionUninstall
to :: forall x. Rep WebExtensionUninstall x -> WebExtensionUninstall
Generic)

instance ToJSON WebExtensionUninstall where
  toJSON :: WebExtensionUninstall -> Value
  toJSON :: WebExtensionUninstall -> Value
toJSON (MkWebExtensionUninstall WebExtensionID
extId) =
    [Pair] -> Value
object
      [ Key
"extension" Key -> WebExtensionID -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= WebExtensionID
extId
      ]


-- ######### Local #########

-- | Represents a command to install a web extension
data WebExtensionResult = WebExtensionInstallResult
  { WebExtensionResult -> WebExtensionID
extension :: WebExtensionID
  }
  deriving (Int -> WebExtensionResult -> ShowS
[WebExtensionResult] -> ShowS
WebExtensionResult -> String
(Int -> WebExtensionResult -> ShowS)
-> (WebExtensionResult -> String)
-> ([WebExtensionResult] -> ShowS)
-> Show WebExtensionResult
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> WebExtensionResult -> ShowS
showsPrec :: Int -> WebExtensionResult -> ShowS
$cshow :: WebExtensionResult -> String
show :: WebExtensionResult -> String
$cshowList :: [WebExtensionResult] -> ShowS
showList :: [WebExtensionResult] -> ShowS
Show, WebExtensionResult -> WebExtensionResult -> Bool
(WebExtensionResult -> WebExtensionResult -> Bool)
-> (WebExtensionResult -> WebExtensionResult -> Bool)
-> Eq WebExtensionResult
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: WebExtensionResult -> WebExtensionResult -> Bool
== :: WebExtensionResult -> WebExtensionResult -> Bool
$c/= :: WebExtensionResult -> WebExtensionResult -> Bool
/= :: WebExtensionResult -> WebExtensionResult -> Bool
Eq, (forall x. WebExtensionResult -> Rep WebExtensionResult x)
-> (forall x. Rep WebExtensionResult x -> WebExtensionResult)
-> Generic WebExtensionResult
forall x. Rep WebExtensionResult x -> WebExtensionResult
forall x. WebExtensionResult -> Rep WebExtensionResult x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. WebExtensionResult -> Rep WebExtensionResult x
from :: forall x. WebExtensionResult -> Rep WebExtensionResult x
$cto :: forall x. Rep WebExtensionResult x -> WebExtensionResult
to :: forall x. Rep WebExtensionResult x -> WebExtensionResult
Generic, [WebExtensionResult] -> Value
[WebExtensionResult] -> Encoding
WebExtensionResult -> Bool
WebExtensionResult -> Value
WebExtensionResult -> Encoding
(WebExtensionResult -> Value)
-> (WebExtensionResult -> Encoding)
-> ([WebExtensionResult] -> Value)
-> ([WebExtensionResult] -> Encoding)
-> (WebExtensionResult -> Bool)
-> ToJSON WebExtensionResult
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
$ctoJSON :: WebExtensionResult -> Value
toJSON :: WebExtensionResult -> Value
$ctoEncoding :: WebExtensionResult -> Encoding
toEncoding :: WebExtensionResult -> Encoding
$ctoJSONList :: [WebExtensionResult] -> Value
toJSONList :: [WebExtensionResult] -> Value
$ctoEncodingList :: [WebExtensionResult] -> Encoding
toEncodingList :: [WebExtensionResult] -> Encoding
$comitField :: WebExtensionResult -> Bool
omitField :: WebExtensionResult -> Bool
ToJSON)

instance FromJSON WebExtensionResult