46 lines
		
	
	
	
		
			1.4 KiB
			
		
	
	
	
		
			Haskell
		
	
	
	
	
	
			
		
		
	
	
			46 lines
		
	
	
	
		
			1.4 KiB
			
		
	
	
	
		
			Haskell
		
	
	
	
	
	
{- optparse-applicative additions
 | 
						|
 -
 | 
						|
 - Copyright 2015 Joey Hess <id@joeyh.name>
 | 
						|
 -
 | 
						|
 - License: BSD-2-clause
 | 
						|
 -}
 | 
						|
 | 
						|
module Utility.OptParse where
 | 
						|
 | 
						|
import Options.Applicative
 | 
						|
import Data.Monoid
 | 
						|
import Prelude
 | 
						|
 | 
						|
-- | A switch that can be enabled using --foo and disabled using --no-foo.
 | 
						|
--
 | 
						|
-- The option modifier is applied to only the option that is *not* enabled
 | 
						|
-- by default. For example:
 | 
						|
--
 | 
						|
-- > invertableSwitch "recursive" True (help "do not recurse into directories")
 | 
						|
-- 
 | 
						|
-- This example makes --recursive enabled by default, so 
 | 
						|
-- the help is shown only for --no-recursive.
 | 
						|
invertableSwitch 
 | 
						|
	:: String -- ^ long option
 | 
						|
	-> Bool -- ^ is switch enabled by default?
 | 
						|
	-> Mod FlagFields Bool -- ^ option modifier
 | 
						|
	-> Parser Bool
 | 
						|
invertableSwitch longopt defv optmod = invertableSwitch' longopt defv
 | 
						|
	(if defv then mempty else optmod)
 | 
						|
	(if defv then optmod else mempty)
 | 
						|
 | 
						|
-- | Allows providing option modifiers for both --foo and --no-foo.
 | 
						|
invertableSwitch'
 | 
						|
	:: String -- ^ long option (eg "foo")
 | 
						|
	-> Bool -- ^ is switch enabled by default?
 | 
						|
	-> Mod FlagFields Bool -- ^ option modifier for --foo
 | 
						|
	-> Mod FlagFields Bool -- ^ option modifier for --no-foo
 | 
						|
	-> Parser Bool
 | 
						|
invertableSwitch' longopt defv enmod dismod = collapse <$> many
 | 
						|
	( flag' True (enmod <> long longopt)
 | 
						|
	<|> flag' False (dismod <> long nolongopt)
 | 
						|
	)
 | 
						|
  where
 | 
						|
	nolongopt = "no-" ++ longopt
 | 
						|
	collapse [] = defv
 | 
						|
	collapse l = last l
 |