marionette-1.0.0: src/Test/Marionette/Frame.hs
module Test.Marionette.Frame where
import Data.Aeson.Types
import Data.Hashable (Hashable)
import GHC.Generics (Generic)
import Test.Marionette.Element (Element (..))
import Prelude
data Frame
= FrameIndex Int
| FrameElement Element
| TopFrame
deriving stock (Generic, Eq, Show)
deriving anyclass (Hashable)
instance FromJSON Frame where
parseJSON = withObject "Frame" \o ->
liftA2 (,) (o .:? "id") (o .:? "element") >>= \case
(Just _, Just _) -> fail "conflicting frame identifiers"
(Just index, Nothing) -> pure . FrameIndex $ index
(Nothing, Just elementId) -> pure . FrameElement . Element $ elementId
(Nothing, Nothing) -> pure TopFrame
instance ToJSON Frame where
toJSON (FrameIndex index) = object ["id" .= index]
toJSON (FrameElement Element{..}) = object ["element" .= elementId]
toJSON TopFrame = object ["id" .= Null]