{-# 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