packages feed

uniform-json-0.1.5.2: src/Uniform/Yaml.hs

---------------------------------------------------------------------
--
-- Module      :  Uniform.Yaml
-- TOD separate markdown
----------------------------------------------------------------------
-- {-# LANGUAGE BangPatterns                   #-}
{-# LANGUAGE ConstraintKinds #-}
-- {-# LANGUAGE DeriveDataTypeable    #-}
{-# LANGUAGE DoAndIfThenElse #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
-- {-# LANGUAGE TypeSynonymInstances        #-}
{-# LANGUAGE UndecidableInstances #-}

module Uniform.Yaml
  ( module Uniform.Yaml,
    -- module Uniform.Error, -- or at least 
    ErrIO,
    -- , Y.decodeEither'
    Y.ParseException (..),
    -- , module Data.Yaml
    Y.decodeFileThrow,
    Y.encode,
    Y.decode,
    Y.decodeEither,
    Options(..)
  )
where

-- import Path -- (Path, Abs, Rel, File, Dir)
-- import Uniform.FileIO (read8, Extension(..))
import Data.Aeson.Types (Options(..))

import qualified Data.Yaml as Y
import UniformBase
-- import Uniform.Error
-- import Unifor.Strings
-- import Uniform.FileIO
import Uniform.Json
-- import Uniform.TypedFile (TypedFile5 (..), TypedFiles7 (..))

decodeThrowT :: Text -> ErrIO Value
decodeThrowT = Y.decodeThrow . t2b

newtype YamlText = YamlText Text deriving (Show, Read, Eq, Ord)

-- a wrapper around Markdonw text
-- todo clean up - use wrap7
unYAML :: YamlText -> Text
unYAML (YamlText a) = a --needed for other ops

extYAML :: Extension
extYAML = Extension "yaml"

yamlFileType :: TypedFile5 Text YamlText

instance Zeros YamlText where zero = YamlText zero

yamlFileType = TypedFile5 {tpext5 = extYAML} :: TypedFile5 Text YamlText

--instance FileHandles YamlText
-- what is missing here?

instance TypedFiles7 Text YamlText where
  -- handling Markdown and read them into YamlText
  wrap7 = YamlText
  unwrap7 (YamlText a) = a

readYaml2value :: Path Abs File -> ErrIO Value
-- read a yaml file to a value
-- error when syntax issue
readYaml2value fp = do
  t <- read8 fp yamlFileType
  return . (yaml2value fp) $ t

yaml2value :: Path Abs File -> YamlText -> Value
-- convert a YamlText to a JSON value, error if not ok
-- how to debug input erros?
yaml2value fp yt = either (errorT . show2) Prelude.id vx
  where
    show2 a =   ["Yaml error in file (line count start 0)", showT fp, ":", showT a] 
    vx = Y.decodeEither' (t2b . unYAML $ yt) :: Either Y.ParseException Value

readYaml2rec :: (FromJSON a, Show a) => Path Abs File -> ErrIO a 
-- | read a yaml file into a record Value 
-- error when syntax fault
readYaml2rec fn = do 
    -- putIOwords [" yaml file name", showT fn ]
    -- settingsTxt <- read8 settingsfilename yamlFileType
    s0 :: Value <- readYaml2value fn 
    -- putIOwords ["yaml read", showPretty s0 ]

    s1  <-  fromJSONerrio  s0  -- :: Result Settings 

    -- putIOwords ["json parsed", showT s1 ]

    return s1
-- for a test use readSettingsfile