packages feed

bookhound-0.1.9.0: src/SyntaxTrees/Toml.hs

module SyntaxTrees.Toml (TomlExpression(..), TableType(..)) where

import Utils.DateTime (showDateTime)
import Utils.Foldable (stringify)
import Utils.Map      (showMap)

import Data.Char (toLower)
import Data.Time (Day, TimeOfDay, ZonedTime (..))

import           Data.Map (Map)
import qualified Data.Map as Map



data TomlExpression
  = TomlInteger Integer
  | TomlFloat Double
  | TomlBool Bool
  | TomlString String
  | TomlDate Day
  | TomlTime TimeOfDay
  | TomlDateTime ZonedTime
  | TomlArray [TomlExpression]
  | TomlTable TableType (Map String TomlExpression)
  | TomlNull
  deriving (Eq, Ord)


data TableType
  = TopLevel
  | Standard
  | Inline
  deriving (Eq, Ord)


instance Show TomlExpression where
  show = \case
    TomlNull                   -> "null"
    TomlInteger n              -> show n
    TomlFloat n                -> show n
    TomlBool bool              -> toLower <$> show bool
    TomlDate date              -> show date
    TomlTime time              -> show time
    TomlDateTime dateTime      -> showDateTime dateTime
    TomlString str             -> show str

    TomlTable Standard table   -> stringify "\n" "" "" 0 $ showMap " = " id show table

    TomlTable TopLevel table   -> stringify "\n\n" "\n" "\n" 0 $ showMap "" showTableHeader show table where
      showTableHeader header = if header /= "" then "[" ++ header ++ "]" ++ "\n"  else ""

    TomlTable Inline table     -> stringify (", " ++ sep) ("{ " ++ sep) (" }" ++ sep) n $
                                    showMap " = " id show table where
      (sep, n) = if (length . mconcat) (show <$> Map.toList table) >= 80 then ("\n", 2) else ("", 0)

    TomlArray arr              -> stringify (", " ++ sep) ("[ " ++ sep) (" ]" ++ sep) n $ show <$> arr where
      (sep, n) = if (length . mconcat) (show <$> arr) >= 80 then ("\n", 2) else ("", 0)