{-|This module provides a convenient way to decode a 'Manager' from yaml string

=== Template

@
  sinks:
    root:
      handlers:
      - console
      - file
    App.Json:
      handlers:
      - file
      propagate: false
    App.Yaml:
      handlers:
      - rotate
      propagate: false

  handlers:
    console:
      type: StreamHandler
      level: DEBUG
      formatter: simple
      stream: stderr
    file:
      type: FileHandler
      level: "Level 100"
      formatter: standard
      file: \/var\/log\/my\/yaml.log
      encoding: utf8
    rotate:
      type: RotatingFileHandler
      level: INFO
      formatter: standard
      file: \/var\/log\/my\/yaml.log
      encoding: utf8
      maxBytes: 1048576
      backupCount: 10

  formatters:
    simple: "{message}"
    standard: "{asctime:%Y-%m-%dT%H:%M:%S%6Q%z} - {level} - {logger}] {message}"

  disabled: false
@
-}
module Logging.Config.Yaml (getManager, getManagerFile) where


import           Control.Exception
import           Data.ByteString
import           Data.Yaml

import           Logging.Config.Type
import           Logging.Manager


{-| decode a 'Manager' from strict 'ByteString', it
1) decodes 'Config' from json string, 2) constructs an 'Manager'

 @since 0.4.0
-}
getManager :: ByteString -> IO Manager
getManager bs =
  case decodeEither' bs of
    Left e       -> throw $ ConfigException $ prettyPrintParseException e
    Right config -> createManager config


{- | decode a 'Manager' from a file, it
1) reads json string from file, 2) calls 'getManager' to construct an 'Manager'

@since 0.4.0
-}
getManagerFile :: FilePath -> IO Manager
getManagerFile path = do
  res <- decodeFileEither path
  case res of
    Left e       -> throw $ ConfigException $ prettyPrintParseException e
    Right config -> createManager config