packages feed

project-m36-0.5: src/bin/TutorialD/Interpreter/Import/TutorialD.hs

module TutorialD.Interpreter.Import.TutorialD where
import ProjectM36.Base
import TutorialD.Interpreter.Import.Base
import TutorialD.Interpreter.Base hiding (try)
import TutorialD.Interpreter.DatabaseContextExpr
import ProjectM36.Error
import qualified ProjectM36.Error as PM36E
import qualified Data.Text as T
import Control.Exception
import qualified Data.ByteString as BS
import qualified Data.Text.Encoding as TE
--import a file containing TutorialD database context expressions

importTutorialD :: FilePath -> IO (Either RelationalError DatabaseContextExpr)
importTutorialD pathIn = do
  eTutdBytes <- try (BS.readFile pathIn) :: IO (Either IOError BS.ByteString)
  case eTutdBytes of 
    Left err -> return $ Left (ImportError $ T.pack (show err))
    Right tutdBytes ->
      case TE.decodeUtf8' tutdBytes of
        Left err -> pure (Left (ImportError $ T.pack (show err)))
        Right tutdUtf8 -> 
          case parse multipleDatabaseContextExprP "import" tutdUtf8 of
            --parseErrorPretty is new in megaparsec 5
            Left err -> pure (Left (PM36E.ParseError (T.pack (show err))))
            Right expr -> pure (Right expr)
  
tutdImportP :: Parser DatabaseContextDataImportOperator
tutdImportP = do
  reserved ":importtutd" 
  path <- quotedString
  spaceConsumer
  return $ DatabaseContextDataImportOperator (T.unpack path) importTutorialD