|
|
|
@ -1,12 +1,10 @@ |
|
|
|
{-# LANGUAGE BangPatterns #-} |
|
|
|
{-# LANGUAGE BangPatterns #-} |
|
|
|
{-# LANGUAGE DeriveGeneric #-} |
|
|
|
{-# LANGUAGE DeriveGeneric #-} |
|
|
|
{-# LANGUAGE DerivingStrategies #-} |
|
|
|
{-# LANGUAGE DerivingStrategies #-} |
|
|
|
{-# LANGUAGE DisambiguateRecordFields #-} |
|
|
|
|
|
|
|
{-# LANGUAGE DuplicateRecordFields #-} |
|
|
|
{-# LANGUAGE DuplicateRecordFields #-} |
|
|
|
{-# LANGUAGE FlexibleContexts #-} |
|
|
|
{-# LANGUAGE FlexibleContexts #-} |
|
|
|
{-# LANGUAGE FlexibleInstances #-} |
|
|
|
{-# LANGUAGE FlexibleInstances #-} |
|
|
|
{-# LANGUAGE GeneralizedNewtypeDeriving #-} |
|
|
|
{-# LANGUAGE GeneralizedNewtypeDeriving #-} |
|
|
|
{-# LANGUAGE MultiWayIf #-} |
|
|
|
|
|
|
|
{-# LANGUAGE OverloadedRecordDot #-} |
|
|
|
{-# LANGUAGE OverloadedRecordDot #-} |
|
|
|
{-# LANGUAGE RecordWildCards #-} |
|
|
|
{-# LANGUAGE RecordWildCards #-} |
|
|
|
{-# LANGUAGE ScopedTypeVariables #-} |
|
|
|
{-# LANGUAGE ScopedTypeVariables #-} |
|
|
|
@ -57,9 +55,8 @@ import GHC.Generics (Generic) |
|
|
|
import Text.Megaparsec (MonadParsec (takeWhileP), |
|
|
|
import Text.Megaparsec (MonadParsec (takeWhileP), |
|
|
|
Parsec (..), ParsecT, anySingle, |
|
|
|
Parsec (..), ParsecT, anySingle, |
|
|
|
customFailure, lookAhead, oneOf, |
|
|
|
customFailure, lookAhead, oneOf, |
|
|
|
parse, runParserT, satisfy, single, |
|
|
|
optional, parse, runParserT, satisfy, |
|
|
|
try, unexpected, (<|>)) |
|
|
|
single, try, unexpected, (<|>)) |
|
|
|
import Text.Megaparsec (optional) |
|
|
|
|
|
|
|
import qualified Text.Megaparsec.Error as ME |
|
|
|
import qualified Text.Megaparsec.Error as ME |
|
|
|
import Text.Megaparsec.Stream (Stream (..)) |
|
|
|
import Text.Megaparsec.Stream (Stream (..)) |
|
|
|
import Text.Read (readMaybe) |
|
|
|
import Text.Read (readMaybe) |
|
|
|
@ -444,7 +441,7 @@ parseTransaqResponses :: BS.ByteString -> [TransaqResponse] |
|
|
|
parseTransaqResponses bs = |
|
|
|
parseTransaqResponses bs = |
|
|
|
let stream = filter (not . isWhitespaceText) . reverse $ execState (unParsingContext $ process defaultProcess bs) [] in |
|
|
|
let stream = filter (not . isWhitespaceText) . reverse $ execState (unParsingContext $ process defaultProcess bs) [] in |
|
|
|
case runST $ runParserT (many txmlParserWrapper) "" stream of |
|
|
|
case runST $ runParserT (many txmlParserWrapper) "" stream of |
|
|
|
Left err -> [] |
|
|
|
Left _ -> [] |
|
|
|
Right result -> catMaybes result |
|
|
|
Right result -> catMaybes result |
|
|
|
where |
|
|
|
where |
|
|
|
txmlParserWrapper = (Just <$> txmlParser) <|> (skipTag >> pure Nothing) |
|
|
|
txmlParserWrapper = (Just <$> txmlParser) <|> (skipTag >> pure Nothing) |
|
|
|
@ -495,15 +492,15 @@ txmlParser = do |
|
|
|
parseResult refResult = do |
|
|
|
parseResult refResult = do |
|
|
|
attr <- takeWhileP Nothing isAttr |
|
|
|
attr <- takeWhileP Nothing isAttr |
|
|
|
mapM_ (parseResultAttr refResult) attr |
|
|
|
mapM_ (parseResultAttr refResult) attr |
|
|
|
void . single $ (XmlOpenEnd "result") |
|
|
|
void . single $ XmlOpenEnd "result" |
|
|
|
t <- anySingle |
|
|
|
t <- anySingle |
|
|
|
case t of |
|
|
|
case t of |
|
|
|
XmlOpen "message" -> do |
|
|
|
XmlOpen "message" -> do |
|
|
|
_ <- takeWhileP Nothing isAttr |
|
|
|
_ <- takeWhileP Nothing isAttr |
|
|
|
void . single $ (XmlOpenEnd "message") |
|
|
|
void . single $ XmlOpenEnd "message" |
|
|
|
(XmlText txt) <- satisfy isText |
|
|
|
(XmlText txt) <- satisfy isText |
|
|
|
void . single $ (XmlClose "message") |
|
|
|
void . single $ XmlClose "message" |
|
|
|
void . single $ (XmlClose "result") |
|
|
|
void . single $ XmlClose "result" |
|
|
|
return . TransaqResponseResult $ ResponseFailure txt |
|
|
|
return . TransaqResponseResult $ ResponseFailure txt |
|
|
|
XmlClose "result" -> do |
|
|
|
XmlClose "result" -> do |
|
|
|
maybeRes <- lift $ readSTRef refResult |
|
|
|
maybeRes <- lift $ readSTRef refResult |
|
|
|
@ -515,8 +512,8 @@ txmlParser = do |
|
|
|
parseResultAttr refResult (XmlAttr "success" "true") = lift $ writeSTRef refResult (Just $ ResponseSuccess Nothing) |
|
|
|
parseResultAttr refResult (XmlAttr "success" "true") = lift $ writeSTRef refResult (Just $ ResponseSuccess Nothing) |
|
|
|
parseResultAttr refResult (XmlAttr "success" "false") = lift $ writeSTRef refResult (Just $ ResponseFailure "") |
|
|
|
parseResultAttr refResult (XmlAttr "success" "false") = lift $ writeSTRef refResult (Just $ ResponseFailure "") |
|
|
|
parseResultAttr refResult attr@(XmlAttr "transactionid" trIdStr) = do |
|
|
|
parseResultAttr refResult attr@(XmlAttr "transactionid" trIdStr) = do |
|
|
|
case (readMaybe (T.unpack trIdStr)) :: Maybe Int64 of |
|
|
|
case readMaybe (T.unpack trIdStr) :: Maybe Int64 of |
|
|
|
t@(Just trId) -> lift $ writeSTRef refResult (Just $ ResponseSuccess t) |
|
|
|
t@(Just _) -> lift $ writeSTRef refResult (Just $ ResponseSuccess t) |
|
|
|
Nothing -> unexpected $ ME.Tokens $ NE.singleton attr |
|
|
|
Nothing -> unexpected $ ME.Tokens $ NE.singleton attr |
|
|
|
parseResultAttr _ _ = return () |
|
|
|
parseResultAttr _ _ = return () |
|
|
|
|
|
|
|
|
|
|
|
|