{- Copyright (C) 2013 Dr. Alistair Ward This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . -} {- | [@AUTHOR@] Dr. Alistair Ward [@DESCRIPTION@] * Defines options for program-operation. * Defines an appropriate default value, which is expected to be over-ridden on the command-line. * Self-validates. -} module FishFood.Data.CommandOptions( -- * Types -- ** Data-types CommandOptions( -- MkCommandOptions, getBinSize, getIncludeEmpty, getNDecimalDigits, getVerbosity ) ) where import qualified Data.Maybe import qualified Distribution.Verbosity import qualified FishFood.Data.File as Data.File import qualified ToolShed.Defaultable import qualified ToolShed.SelfValidate -- | Declares a record to contain command-line options. data CommandOptions = MkCommandOptions { getBinSize :: Maybe Data.File.FileSize, -- ^ The intervals into which file-sizes are categorised. getIncludeEmpty :: Bool, -- ^ Whether to display empty bins. getNDecimalDigits :: Int, -- ^ The precision to which fractional auxiliary data is displayed. getVerbosity :: Distribution.Verbosity.Verbosity -- ^ The threshold for ancillary information-output. } deriving Show instance ToolShed.Defaultable.Defaultable CommandOptions where defaultValue = MkCommandOptions { getBinSize = Nothing, --Interpreted as one standard-deviation. getIncludeEmpty = False, getNDecimalDigits = 3, getVerbosity = Distribution.Verbosity.normal } instance ToolShed.SelfValidate.SelfValidator CommandOptions where getErrors commandOptions@MkCommandOptions { getBinSize = binSize, getNDecimalDigits = nDecimalDigits } = map snd $ filter fst [ ( Data.Maybe.maybe False (<= 0) binSize, "the bin-size must exceed zero; " ++ show commandOptions ++ "." ), ( nDecimalDigits < 1, "the number of decimal digits must exceed zero; " ++ show commandOptions ++ "." ), let maxNDecimalDigits = floor $ fromIntegral ( floatDigits ( undefined :: Double --CAVEAT: the actual type could be merely 'Float', but that's currently unknown. ) ) * (logBase 10 2 :: Double) in ( nDecimalDigits > maxNDecimalDigits, "the number of decimal digits shouldn't exceed " ++ show maxNDecimalDigits ++ "; " ++ show commandOptions ++ "." ) ]