packages feed

miv-0.4.9: src/Command.hs

module Command where

import Data.Default (Default(..))
import Data.Text (Text, null, unwords)
import Data.Text.Builder.Linear qualified as Builder
import Data.Text.Display (Display(..), display)
import Prelude hiding (null, unwords)

data Command =
  Command {
    name     :: Text,
    repl     :: Text,
    bang     :: Bool,
    bar      :: Bool,
    register :: Bool,
    buffer   :: Bool,
    range    :: Maybe CmdRange,
    arg      :: CmdArg,
    complete :: Maybe CmdComplete
  } deriving Eq

instance Display Command where
  displayBuilder cmd =
    Builder.fromText $ unwords $ filter (not . null)
        [ "command!",
          if cmd.bang then "-bang" else "",
          if cmd.bar then "-bar" else "",
          if cmd.register then "-register" else "",
          if cmd.buffer then "-buffer" else "",
          maybe "" display cmd.range,
          display cmd.arg,
          maybe "" display cmd.complete,
          cmd.name,
          cmd.repl ]

instance Default Command where
  def = Command {
    name     = "",
    repl     = "",
    bang     = True,
    bar      = False,
    register = False,
    buffer   = False,
    range    = Just CmdRange,
    arg      = CmdNonNegArg,
    complete = Nothing
  }

data CmdRange = CmdRange
              | CmdRangeWhole
              | CmdRangeN Int
              | CmdRangeCount Int
              deriving Eq

instance Display CmdRange where
  displayBuilder = Builder.fromText . \case
    CmdRange        -> "-range"
    CmdRangeWhole   -> "-range=%"
    CmdRangeN n     -> "-range=" <> display n
    CmdRangeCount n -> "-count=" <> display n

data CmdArg = CmdNonNegArg
            | CmdZeroOneArg
            | CmdPositiveArg
            | CmdOneArg
            | CmdNoArg
            deriving Eq

instance Display CmdArg where
  displayBuilder = Builder.fromText . \case
    CmdNonNegArg   -> "-nargs=*"
    CmdZeroOneArg  -> "-nargs=?"
    CmdPositiveArg -> "-nargs=+"
    CmdOneArg      -> "-nargs=1"
    CmdNoArg       -> "-nargs=0"

newtype CmdComplete = CmdComplete Text
                    deriving Eq

instance Display CmdComplete where
  displayBuilder (CmdComplete complete) =
    Builder.fromText $ "-complete=" <> complete