chiasma-0.10.1.0: lib/Chiasma/Data/WithPaneId.hs
module Chiasma.Data.WithPaneId where
import qualified Data.Text as Text
import Chiasma.Codec (TmuxCodec (decode, query), trim)
import Chiasma.Codec.Decode (primDecode)
import Chiasma.Data.DecodeError (DecodeError (DecodeError), DecodeFailure (TooFewFields))
import qualified Chiasma.Data.TmuxId as TmuxId
import Chiasma.Data.TmuxId (HasPaneId, PaneId)
import Chiasma.Data.TmuxQuery (TmuxQuery (TmuxQuery))
data WithPaneId a =
WithPaneId {
paneId :: PaneId,
pane :: a
}
deriving stock (Eq, Show, Generic)
instance HasPaneId (WithPaneId a) where
paneId = (.paneId)
safeBreakOn :: Text -> Text -> Maybe (Text, Text)
safeBreakOn n = \case
"" -> Nothing
t -> Just (second (Text.drop 1) (Text.breakOn n t))
instance TmuxCodec a => TmuxCodec (WithPaneId a) where
decode payload =
case safeBreakOn " " (trim payload) of
Just (idField, rest) -> do
pane <- decode rest
paneId <- first (DecodeError [payload]) (primDecode idField)
pure WithPaneId {..}
Nothing ->
Left (DecodeError [payload] TooFewFields)
query =
let TmuxQuery paneQuery = query @a
in TmuxQuery ("#{pane_id} " <> paneQuery)