packages feed

json-to-haskell-0.1.1.1: src/JsonToHaskell/Internal/Options.hs

{-# LANGUAGE TemplateHaskell #-}
module JsonToHaskell.Internal.Options where

import Lens.Micro.Platform (makeLenses)

-- | Choose which type to use for Numbers
data NumberType =
    -- | Use 'Int' for whole numbers, 'Float' for decimals
    UseSmartFloats
    -- | Use 'Int' for whole numbers, 'Double' for decimals
  | UseSmartDoubles
    -- | Use 'Float' for all numbers
  | UseFloats
    -- | Use 'Double' for all numbers
  | UseDoubles
    -- | Use 'Scientific' for all numbers
  | UseScientific
  deriving (Show, Eq, Ord)

-- | Choose which type to use for strings
data TextType =
    -- | Use 'String' for strings
    UseString
    -- | Use 'Text' for string
  | UseText
    -- | Use 'ByteString' for strings
  | UseByteString
  deriving (Show, Eq, Ord)

-- | Choose which type to use for key-value maps
data MapType =
    -- | Use Data.Map
    UseMap
    -- | Use Data.HashMap
  | UseHashMap
  deriving (Show, Eq, Ord)

-- | Choose which type to use for arrays
data ListType =
    -- | Use lists
    UseList
    -- | Use vectors
  | UseVector
  deriving (Show, Eq, Ord)

-- | Options for module generation
data Options = Options
  { _tabStop :: Int
  , _numberType :: NumberType
  , _textType :: TextType
  , _mapType :: MapType
  , _listType :: ListType
  , _includeHeader :: Bool
  , _includeInstances :: Bool
  , _strictData :: Bool
  , _prefixRecordFields :: Bool
  } deriving (Show, Eq, Ord)


makeLenses ''Options

-- | Simple module generation options.
-- These are reasonable defaults for a simple module
simpleOptions :: Options
simpleOptions = Options
    { _tabStop = 2
    , _numberType = UseDoubles
    , _textType = UseText
    , _mapType = UseMap
    , _listType = UseList
    , _includeHeader = True
    , _includeInstances = False
    , _strictData = False
    , _prefixRecordFields = True
    }

-- | Use more performant data types, use these for production apps.
performantOptions :: Options
performantOptions = Options
    { _tabStop = 2
    , _numberType = UseDoubles
    , _textType = UseText
    , _mapType = UseMap
    , _listType = UseList
    , _includeHeader = True
    , _includeInstances = False
    , _strictData = True
    , _prefixRecordFields = True
    }