-- |
-- License: GPL-3.0-or-later
-- Copyright: Oleg Grenrus
module CabalFmt.Options (
    Mode (..),
    Options (..),
    defaultOptions,
    OptionsMorphism, mkOptionsMorphism, runOptionsMorphism,
    HasOptions(..),
    ) where

import Distribution.Compat.Lens (LensLike')

import qualified Distribution.CabalSpecVersion       as C

data Mode
    = ModeStdout
    | ModeInplace
    | ModeCheck
  deriving (Eq, Show)

data Options = Options
    { optError       :: !Bool
    , optIndent      :: !Int
    , optTabular     :: !Bool
    , optSpecVersion :: !C.CabalSpecVersion
    , optMode        :: !Mode
    }
  deriving Show

defaultOptions :: Options
defaultOptions = Options
    { optError       = False
    , optIndent      = 2
    , optTabular     = True
    , optSpecVersion = C.cabalSpecLatest
    , optMode        = ModeStdout
    }

newtype OptionsMorphism = OM (Options -> Options)

runOptionsMorphism :: OptionsMorphism -> Options -> Options
runOptionsMorphism (OM f) = f

mkOptionsMorphism :: (Options -> Options) -> OptionsMorphism
mkOptionsMorphism = OM

instance Semigroup OptionsMorphism where
    OM f <> OM g = OM (g . f)

instance Monoid OptionsMorphism where
    mempty  = OM id
    mappend = (<>)

class HasOptions e where
    options :: Functor f => LensLike' f e Options

instance HasOptions Options where
    options = id