packages feed

pms-domain-service-0.0.3.0: src/PMS/Domain/Service/DS/State/Run/PromptsList.hs

{-# LANGUAGE GADTs #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE OverloadedStrings #-}

module PMS.Domain.Service.DS.State.Run.PromptsList where

import Control.Monad.IO.Class
import Control.Monad.Trans.Class
import Control.Monad.Logger
import qualified Data.Text as T
import Control.Lens
import Control.Monad.Reader
import qualified Control.Concurrent.STM as STM
import System.FilePath
import System.Directory
import Control.Monad.Except
import qualified Data.ByteString.Lazy as BL
import qualified Data.ByteString.Lazy.Char8 as BL8

import qualified PMS.Domain.Model.DM.Type as DM
import qualified PMS.Domain.Model.DM.Constant as DM

import PMS.Domain.Service.DM.Type
import qualified PMS.Domain.Service.DS.Utility as U


-- |
--
instance IStateActivity RunStateData PromptsListEventData where
  action _ (PromptsListEvent (PromptsListEventData dat)) = flip catchError errHdl $ do
    $logDebugS DM._LOGTAG "Run PromptsListEvent called."

    promptsDir <- view DM.promptsDirDomainData <$> lift ask

    let promptsFile = promptsDir </> DM._PROMPTS_LIST_FILE
    exists <- liftIO $ doesFileExist promptsFile
    cont <- if exists
              then U.readFile promptsFile
              else do
                $logInfoS DM._LOGTAG $ T.pack $ "file not found." ++ promptsFile
                return "[]"

    response cont
    return noStateTransition

    where
      errHdl :: String -> AppContext (Maybe StateTransition)
      errHdl msg = do
        $logErrorS DM._LOGTAG $ T.pack $ "PromptsListEventData: exception occurred. " ++ msg
        response $ BL8.pack msg
        return noStateTransition

      response :: BL.ByteString -> AppContext ()
      response cont = do
        let result = DM.McpPromptsListResponseResult $ DM.RawJsonByteString cont
            jsonRpc = dat^.DM.jsonrpcMcpPromptsListRequestData
            resDat = DM.McpPromptsListResponseData jsonRpc result
            res = DM.McpPromptsListResponse resDat

        $logDebugS DM._LOGTAG $ T.pack $ show res

        queue <- view DM.responseQueueDomainData <$> lift ask
        liftIO $ STM.atomically $ STM.writeTQueue queue res