packages feed

miv-0.4.5: src/Cmdline.hs

{-# LANGUAGE OverloadedStrings #-}
module Cmdline where

import Data.Aeson
import qualified Data.Aeson as Aeson
import Data.Hashable
import Data.Text (Text,unpack)
import Prelude hiding (show)
import qualified Prelude as Prelude

import ReadText
import ShowText

data Cmdline = CmdlineExCommand
             | CmdlineForwardSearch
             | CmdlineBackwardSearch
             | CmdlineInput
             deriving (Eq, Ord)

instance ShowText Cmdline where
  show CmdlineExCommand      = ":"
  show CmdlineForwardSearch  = "/"
  show CmdlineBackwardSearch = "?"
  show CmdlineInput          = "@"

instance ReadText Cmdline where
  read ":" = CmdlineExCommand
  read "/" = CmdlineForwardSearch
  read "?" = CmdlineBackwardSearch
  read "@" = CmdlineInput
  read m   = error $ "unknown cmdline: " ++ unpack m

instance Hashable Cmdline where
  hashWithSalt a CmdlineExCommand      = a `hashWithSalt` (0 :: Int)
  hashWithSalt a CmdlineForwardSearch  = a `hashWithSalt` (1 :: Int)
  hashWithSalt a CmdlineBackwardSearch = a `hashWithSalt` (2 :: Int)
  hashWithSalt a CmdlineInput          = a `hashWithSalt` (3 :: Int)

instance FromJSON Cmdline where
  parseJSON (Aeson.String str)
    | unpack str == ":" = return CmdlineExCommand
    | unpack str == "/" = return CmdlineForwardSearch
    | unpack str == "?" = return CmdlineBackwardSearch
    | unpack str == "@" = return CmdlineInput
  parseJSON o = error $ "failed to parse cmdline: " <> Prelude.show o

cmdlinePattern :: Cmdline -> Text
cmdlinePattern CmdlineExCommand      = ":"
cmdlinePattern CmdlineForwardSearch  = "/"
cmdlinePattern CmdlineBackwardSearch = "\\?"
cmdlinePattern CmdlineInput          = "@"