From 45154a9393c7206d5c2fe910b2b059b4f0a1334b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20H=C3=B8jberg?= Date: Wed, 11 Sep 2024 13:22:37 -0400 Subject: [PATCH 1/2] Summary unexpected server responses When we hit an unexpected server response, summarize it with the status code, status message and the response body instead of dumping the raw Haskell data-structures. --- .../src/Unison/CommandLine/OutputMessages.hs | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/unison-cli/src/Unison/CommandLine/OutputMessages.hs b/unison-cli/src/Unison/CommandLine/OutputMessages.hs index a0d855abb2..dc97d8a880 100644 --- a/unison-cli/src/Unison/CommandLine/OutputMessages.hs +++ b/unison-cli/src/Unison/CommandLine/OutputMessages.hs @@ -7,6 +7,7 @@ module Unison.CommandLine.OutputMessages where import Control.Lens hiding (at) import Control.Monad.State.Strict qualified as State +import Data.ByteString qualified as ByteString import Data.ByteString.Lazy qualified as LazyByteString import Data.Foldable qualified as Foldable import Data.List (stripPrefix) @@ -20,12 +21,15 @@ import Data.Set.NonEmpty (NESet) import Data.Text qualified as Text import Data.Text.Encoding qualified as Text import Data.Text.Lazy qualified as TL +import Data.Text.Lazy.Builder qualified as B +import Data.Text.Lazy.Builder.Int qualified as B import Data.Time (UTCTime, getCurrentTime) import Data.Tuple (swap) import Data.Tuple.Extra (dupe) import Data.Void (absurd) import Debug.RecoverRTTI qualified as RTTI import Network.HTTP.Types qualified as Http +import Network.HTTP.Types.Status qualified as HttpStatus import Servant.Client qualified as Servant import System.Console.ANSI qualified as ANSI import System.Console.Haskeline.Completion qualified as Completion @@ -974,7 +978,6 @@ notifyUser dir = \case -- defs in the codebase. In some cases it's fine for bindings to -- shadow codebase names, but you don't want it to capture them in -- the decompiled output. - let prettyBindings = P.bracket . P.lines $ P.wrap "The watch expression(s) reference these definitions:" @@ -1767,23 +1770,32 @@ notifyUser dir = \case <> P.newline <> P.newline <> P.indentN 2 (P.pshown response) - Servant.FailureResponse request response -> - P.wrap "Oops, I received an unexpected status code from the server." - <> P.newline - <> P.newline - <> P.wrap "Here is the request." - <> P.newline + Servant.FailureResponse _ response -> + P.wrap "Sorry, I wasn't able to perform the request. The server responded unexpectedly with: " <> P.newline - <> P.indentN 2 (P.pshown request) - <> P.newline - <> P.newline - <> P.wrap "Here is the full response." <> P.newline + <> P.indentN 2 (P.wrap ("Status " <> P.text (statusCode response) <> ", " <> P.text (statusMessage response))) <> P.newline - <> P.indentN 2 (P.pshown response) + <> P.indentN 2 (P.wrap (P.text (responseBody response))) Servant.InvalidContentTypeHeader response -> wrongContentType response Servant.UnsupportedContentType _mediaType response -> wrongContentType response where + statusCode :: Servant.Response -> Text + statusCode response = + intToText (HttpStatus.statusCode (Servant.responseStatusCode response)) + where + intToText = TL.toStrict . B.toLazyText . B.decimal + + statusMessage :: Servant.Response -> Text + statusMessage response = + Text.decodeUtf8 (HttpStatus.statusMessage (Servant.responseStatusCode response)) + + responseBody :: Servant.Response -> Text + responseBody response = + toText (Servant.responseBody response) + where + toText = Text.decodeUtf8 . ByteString.concat . LazyByteString.toChunks + wrongContentType response = P.wrap "Huh, the server sent me the wrong content type." <> P.newline From 2fe25f3c764418766a841b385b80d8deaecc485d Mon Sep 17 00:00:00 2001 From: hojberg Date: Wed, 11 Sep 2024 17:24:19 +0000 Subject: [PATCH 2/2] automatically run ormolu --- unison-cli/src/Unison/CommandLine/OutputMessages.hs | 1 + 1 file changed, 1 insertion(+) diff --git a/unison-cli/src/Unison/CommandLine/OutputMessages.hs b/unison-cli/src/Unison/CommandLine/OutputMessages.hs index dc97d8a880..473516b5d3 100644 --- a/unison-cli/src/Unison/CommandLine/OutputMessages.hs +++ b/unison-cli/src/Unison/CommandLine/OutputMessages.hs @@ -978,6 +978,7 @@ notifyUser dir = \case -- defs in the codebase. In some cases it's fine for bindings to -- shadow codebase names, but you don't want it to capture them in -- the decompiled output. + let prettyBindings = P.bracket . P.lines $ P.wrap "The watch expression(s) reference these definitions:"