Skip to content

Commit bcda142

Browse files
committed
Work in feedback regarding error handling
1 parent c8a88a3 commit bcda142

File tree

1 file changed

+32
-17
lines changed

1 file changed

+32
-17
lines changed

cabal-install/src/Distribution/Client/CmdStatus.hs

+32-17
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
{-# LANGUAGE RecordWildCards #-}
33
{-# LANGUAGE NamedFieldPuns #-}
44
{-# LANGUAGE LambdaCase #-}
5+
{-# LANGUAGE FlexibleContexts #-}
56
-----------------------------------------------------------------------------
67
-- |
78
-- Module : Distribution.Client.CmdStatus
@@ -17,8 +18,7 @@ module Distribution.Client.CmdStatus (
1718
statusCommand, statusAction,
1819
) where
1920

20-
import Control.Monad
21-
( mapM )
21+
import Control.Monad.Except hiding (mfilter)
2222
import qualified Data.Map as Map
2323

2424
import Prelude ()
@@ -91,8 +91,12 @@ statusCommand = CommandUI
9191
-- Flags
9292
-------------------------------------------------------------------------------
9393

94+
-- | Output format of project metadata.
9495
data StatusOutputFormat
9596
= JSON
97+
-- ^ Output of project metadata shall be in JSON.
98+
--
99+
-- @since 3.7.0.0
96100
deriving (Eq, Ord, Show, Read)
97101

98102
data StatusFlags = StatusFlags
@@ -156,7 +160,7 @@ statusAction flags@NixStyleFlags { extraFlags = statusFlags, ..} cliTargetString
156160
when (NoFlag == statusOutputFormat statusFlags) $ do
157161
die' verbosity "The status command requires the flag '--output-format'."
158162
when (not $ null cliTargetStrings) $
159-
die' verbosity "The status command takes not target arguments directly. Use appropriate flags to pass in target information."
163+
die' verbosity "The status command doesn't take target arguments directly. Use appropriate flags to pass in target information."
160164

161165
baseCtx <- establishProjectBaseContext verbosity cliConfig OtherCommand
162166
(_, elaboratedPlan, elabSharedConfig, _, _) <-
@@ -170,7 +174,10 @@ statusAction flags@NixStyleFlags { extraFlags = statusFlags, ..} cliTargetString
170174
then pure Nothing
171175
else do
172176
let compiler = pkgConfigCompiler elabSharedConfig
173-
compilerProg <- requireCompilerProg verbosity compiler
177+
compilerProg <- runExceptT (requireCompilerProg compiler)
178+
>>= \case
179+
Right c -> pure c
180+
Left errMsg -> die' verbosity errMsg
174181
let progDb = pkgConfigCompilerProgs elabSharedConfig
175182
(configuredCompilerProg, _) <- requireProgram verbosity compilerProg progDb
176183
pure $ Just $ mkCompilerInfo configuredCompilerProg compiler
@@ -206,8 +213,11 @@ statusAction flags@NixStyleFlags { extraFlags = statusFlags, ..} cliTargetString
206213
, siTargetResolving = resolvedTargets
207214
}
208215

209-
serialisedStatusInformation <- serialise verbosity (statusOutputFormat statusFlags) si
210-
216+
serialisedStatusInformation <- runExceptT (serialise (statusOutputFormat statusFlags) si)
217+
>>= \case
218+
Right s -> pure s
219+
Left errMsg -> die' verbosity errMsg
220+
211221
-- Final output
212222
putStrLn $ withOutputMarker verbosity serialisedStatusInformation
213223
where
@@ -241,12 +251,12 @@ data ResolvedTarget = ResolvedTarget
241251
}
242252
deriving (Show, Read, Eq, Ord)
243253

244-
serialise :: Verbosity -> Flag StatusOutputFormat -> StatusInformation -> IO String
245-
serialise verbosity NoFlag _ =
246-
die' verbosity $ "Could not serialise Status information. "
247-
++ "The flag '--output-format' is required."
254+
serialise :: MonadError String m => Flag StatusOutputFormat -> StatusInformation -> m String
255+
serialise NoFlag _ =
256+
throwError $ "Could not serialise Status information. "
257+
++ "The flag '--output-format' is required."
248258

249-
serialise _ (Flag JSON) si = pure $ Json.encodeToString $ Json.object $
259+
serialise (Flag JSON) si = pure $ Json.encodeToString $ Json.object $
250260
[ "cabal-version" .= jdisplay (siCabalVersion si)
251261
]
252262
++ prettyCompilerInfo (siCompiler si)
@@ -271,17 +281,16 @@ serialise _ (Flag JSON) si = pure $ Json.encodeToString $ Json.object $
271281
, "unit-id" .= maybe Json.Null jdisplay (rtUnitId rt)
272282
]
273283

274-
275284
-- ----------------------------------------------------------------------------
276285
-- Helpers for determining and serialising compiler information
277286
-- ----------------------------------------------------------------------------
278287

279-
requireCompilerProg :: Verbosity -> Compiler -> IO Program
280-
requireCompilerProg verbosity compiler =
288+
requireCompilerProg :: MonadError String m => Compiler -> m Program
289+
requireCompilerProg compiler =
281290
case compilerFlavor compiler of
282291
GHC -> pure ghcProgram
283292
GHCJS -> pure ghcjsProgram
284-
flavour -> die' verbosity $
293+
flavour -> throwError $
285294
"status: Unsupported compiler flavour: "
286295
<> prettyShow flavour
287296

@@ -297,13 +306,19 @@ mkBuildInfoJson :: ElaboratedInstallPlan -> TargetsMap -> Map TargetSelector Str
297306
mkBuildInfoJson elaboratedPlan targetsMap tsMap unresolvableTargetStrings =
298307
[ ResolvedTarget str (Just uid)
299308
| uid <- Map.keys subsetInstallPlan
309+
-- for all unit-ids that have been requested, look at all their TargetSelector's
300310
, (_, tss) <- targetsMap Map.! uid
311+
-- Now, for each TargetSelector, lookup the original target string users have given.
312+
-- We have to remove duplicates, because certain target strings are represented as
313+
-- multiple TargetSelector's.
301314
, str <- ordNub $ map tsToOriginalTarget $ toList tss
302315
]
303316
++ map mkUnresolvedTarget unresolvableTargetStrings
304317
where
318+
-- Only look at unit-ids we care about because the user has requested them
305319
subsetInstallPlan = Map.restrictKeys (InstallPlan.toMap elaboratedPlan) (Map.keysSet targetsMap)
306320

321+
-- Easier lookup for the reverse table
307322
tsToOriginalTarget ts = tsMap Map.! ts
308323

309324
mkUnresolvedTarget :: String -> ResolvedTarget
@@ -370,8 +385,8 @@ readTargetSelector pkgs mfilter targetStr =
370385
readTargetSelectors pkgs mfilter [targetStr] >>= \case
371386
Left [problem] -> pure $ Left problem
372387
Right [ts] -> pure $ Right ts
373-
_ -> error $ "CmdStatus.readTargetSelector: invariant broken, more than "
374-
++ "one target passed *somehow*."
388+
_ -> fail $ "CmdStatus.readTargetSelector: invariant broken, more than "
389+
++ "one target passed *somehow*."
375390

376391
-- ----------------------------------------------------------------------------
377392
-- JSON serialisation helpers

0 commit comments

Comments
 (0)