Относительно плохо знаком с Haskell и не может понять, почему не работает следующее.
Я анализирую объект из запроса веб-сокета, используя Aeson, и пытаюсь его распечатать.
Все отпечатки дотот, о котором идет речь, работает, но этот никогда не печатает.Я также попробовал варианты с fromMaybe
и предоставлением значения по умолчанию, но это тоже не помогло.
Команда - это просто объект записи, содержащий несколько (может быть, Map) различных объектов.Все они имеют экземпляры FromJSON и т. Д.
Обычно присутствует только одна из карт, но я собираюсь выполнить некоторое накопление позже, что может означать, что несколько объектов были переданы одновременно.
data Command = Command { _articles :: Maybe ArticleMapMaybe
, _clients :: Maybe ClientMapMaybe
, _orders :: Maybe OrderMapMaybe } deriving (Show, Eq, Generic)
instance FromJSON Command
instance ToJSON Command
-- take a request from the queue and service it
wsApplication :: MVar ServerState
-> WS.ServerApp
wsApplication state pending = do
putStrLn "Processing request"
let path = WS.requestPath (WS.pendingRequest pending)
putStrLn $ "path: " ++ (BS.unpack $ BS.fromStrict path)
conn <- WS.acceptRequest pending
query <- WS.receiveData conn
putStrLn $ "query: " ++ (T.unpack query)
let command = (A.decode $ BS.pack . T.unpack $ query) :: Maybe Command
print command -- this doesn't do anything!
let client = (query, conn) :: SocketClient
modifyMVar_ state $ return . addClient client
serverState <- readMVar state
putStrLn $ "connected clients: " ++ (show . length $ serverState ^. connectedClients)
perform state client command
Результат:
Processing request
path: /api
query: {"_clients":null,"_orders":null,"_articles":{"dsa141":{"_notes":"ewq","_articleName":"Stellaris: Apocalypse"}}}
Processing request
path: /api
Если я удалю строку «команда печати», будут напечатаны также следующие строки («подключенные клиенты»).Это означает, что при печати команды функциональные блоки ..?Очевидно, что результат синтаксического анализа не зависит от MVars или чего-либо в этом роде (а «подключенные клиенты» печатают, что означает, что состояние сервера MVar не заблокировано ...).