packages feed

highlight-1.0.0.2: src/Highlight/Highlight/Options.hs

{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE OverloadedStrings #-}

module Highlight.Highlight.Options
  ( ColorGrepFilenames(..)
  , colorGrepFilenamesParser
  , HasColorGrepFilenames(..)
  , Options(..)
  , defaultOptions
  , optionsParser
  , HasOptions(..)
  , module Highlight.Common.Options
  ) where

import Prelude ()
import Prelude.Compat

import Control.Lens (Lens', lens)
import Options.Applicative (Parser, flag, help, long, short)

import Highlight.Common.Options
       (CommonOptions, HasCommonOptions(commonOptionsLens),
        HasIgnoreCase(ignoreCaseLens), HasInputFilenames(inputFilenamesLens),
        HasRawRegex(rawRegexLens), HasRecursive(recursiveLens),
        IgnoreCase(DoNotIgnoreCase, IgnoreCase),
        InputFilename(InputFilename, unInputFilename), RawRegex(RawRegex),
        Recursive(Recursive), commonOptionsParser, defaultCommonOptions)

--------------------------
-- Color grep filenames --
--------------------------

-- | Whether or not to color filenames output by @grep@ when reading in from
-- stdin.
data ColorGrepFilenames = ColorGrepFilenames | DoNotColorGrepFileNames
  deriving (Eq, Read, Show)

class HasColorGrepFilenames r where
  colorGrepFilenamesLens :: Lens' r ColorGrepFilenames

colorGrepFilenamesParser :: Parser ColorGrepFilenames
colorGrepFilenamesParser =
  let mods =
        long "from-grep" <>
        short 'g' <>
        help "highlight output from grep"
  in flag DoNotColorGrepFileNames ColorGrepFilenames mods

-------------
-- Options --
-------------

data Options = Options
  { optionsColorGrepFilenames :: ColorGrepFilenames
  , optionsCommonOptions :: CommonOptions
  } deriving (Eq, Read, Show)

class HasOptions r where
  optionsLens :: Lens' r Options

instance HasOptions Options where
  optionsLens :: Lens' Options Options
  optionsLens = id

instance HasColorGrepFilenames Options where
  colorGrepFilenamesLens :: Lens' Options ColorGrepFilenames
  colorGrepFilenamesLens =
    lens
      optionsColorGrepFilenames
      (\s a -> s {optionsColorGrepFilenames = a})

instance HasCommonOptions Options where
  commonOptionsLens :: Lens' Options CommonOptions
  commonOptionsLens =
    lens
      optionsCommonOptions
      (\s a -> s {optionsCommonOptions = a})

instance HasIgnoreCase Options
instance HasRecursive Options
instance HasRawRegex Options
instance HasInputFilenames Options

optionsParser :: Parser Options
optionsParser =
  Options
    <$> colorGrepFilenamesParser
    <*> commonOptionsParser

defaultOptions :: Options
defaultOptions = Options DoNotColorGrepFileNames defaultCommonOptions