2
2
{-# LANGUAGE RecordWildCards #-}
3
3
{-# LANGUAGE NamedFieldPuns #-}
4
4
{-# LANGUAGE LambdaCase #-}
5
+ {-# LANGUAGE FlexibleContexts #-}
5
6
-----------------------------------------------------------------------------
6
7
-- |
7
8
-- Module : Distribution.Client.CmdStatus
@@ -17,8 +18,7 @@ module Distribution.Client.CmdStatus (
17
18
statusCommand , statusAction ,
18
19
) where
19
20
20
- import Control.Monad
21
- ( mapM )
21
+ import Control.Monad.Except hiding (mfilter )
22
22
import qualified Data.Map as Map
23
23
24
24
import Prelude ()
@@ -91,8 +91,12 @@ statusCommand = CommandUI
91
91
-- Flags
92
92
-------------------------------------------------------------------------------
93
93
94
+ -- | Output format of project metadata.
94
95
data StatusOutputFormat
95
96
= JSON
97
+ -- ^ Output of project metadata shall be in JSON.
98
+ --
99
+ -- @since 3.7.0.0
96
100
deriving (Eq , Ord , Show , Read )
97
101
98
102
data StatusFlags = StatusFlags
@@ -156,7 +160,7 @@ statusAction flags@NixStyleFlags { extraFlags = statusFlags, ..} cliTargetString
156
160
when (NoFlag == statusOutputFormat statusFlags) $ do
157
161
die' verbosity " The status command requires the flag '--output-format'."
158
162
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."
160
164
161
165
baseCtx <- establishProjectBaseContext verbosity cliConfig OtherCommand
162
166
(_, elaboratedPlan, elabSharedConfig, _, _) <-
@@ -170,7 +174,10 @@ statusAction flags@NixStyleFlags { extraFlags = statusFlags, ..} cliTargetString
170
174
then pure Nothing
171
175
else do
172
176
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
174
181
let progDb = pkgConfigCompilerProgs elabSharedConfig
175
182
(configuredCompilerProg, _) <- requireProgram verbosity compilerProg progDb
176
183
pure $ Just $ mkCompilerInfo configuredCompilerProg compiler
@@ -206,8 +213,11 @@ statusAction flags@NixStyleFlags { extraFlags = statusFlags, ..} cliTargetString
206
213
, siTargetResolving = resolvedTargets
207
214
}
208
215
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
+
211
221
-- Final output
212
222
putStrLn $ withOutputMarker verbosity serialisedStatusInformation
213
223
where
@@ -241,12 +251,12 @@ data ResolvedTarget = ResolvedTarget
241
251
}
242
252
deriving (Show , Read , Eq , Ord )
243
253
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."
248
258
249
- serialise _ (Flag JSON ) si = pure $ Json. encodeToString $ Json. object $
259
+ serialise (Flag JSON ) si = pure $ Json. encodeToString $ Json. object $
250
260
[ " cabal-version" .= jdisplay (siCabalVersion si)
251
261
]
252
262
++ prettyCompilerInfo (siCompiler si)
@@ -271,17 +281,16 @@ serialise _ (Flag JSON) si = pure $ Json.encodeToString $ Json.object $
271
281
, " unit-id" .= maybe Json. Null jdisplay (rtUnitId rt)
272
282
]
273
283
274
-
275
284
-- ----------------------------------------------------------------------------
276
285
-- Helpers for determining and serialising compiler information
277
286
-- ----------------------------------------------------------------------------
278
287
279
- requireCompilerProg :: Verbosity - > Compiler -> IO Program
280
- requireCompilerProg verbosity compiler =
288
+ requireCompilerProg :: MonadError String m = > Compiler -> m Program
289
+ requireCompilerProg compiler =
281
290
case compilerFlavor compiler of
282
291
GHC -> pure ghcProgram
283
292
GHCJS -> pure ghcjsProgram
284
- flavour -> die' verbosity $
293
+ flavour -> throwError $
285
294
" status: Unsupported compiler flavour: "
286
295
<> prettyShow flavour
287
296
@@ -297,13 +306,19 @@ mkBuildInfoJson :: ElaboratedInstallPlan -> TargetsMap -> Map TargetSelector Str
297
306
mkBuildInfoJson elaboratedPlan targetsMap tsMap unresolvableTargetStrings =
298
307
[ ResolvedTarget str (Just uid)
299
308
| uid <- Map. keys subsetInstallPlan
309
+ -- for all unit-ids that have been requested, look at all their TargetSelector's
300
310
, (_, 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.
301
314
, str <- ordNub $ map tsToOriginalTarget $ toList tss
302
315
]
303
316
++ map mkUnresolvedTarget unresolvableTargetStrings
304
317
where
318
+ -- Only look at unit-ids we care about because the user has requested them
305
319
subsetInstallPlan = Map. restrictKeys (InstallPlan. toMap elaboratedPlan) (Map. keysSet targetsMap)
306
320
321
+ -- Easier lookup for the reverse table
307
322
tsToOriginalTarget ts = tsMap Map. ! ts
308
323
309
324
mkUnresolvedTarget :: String -> ResolvedTarget
@@ -370,8 +385,8 @@ readTargetSelector pkgs mfilter targetStr =
370
385
readTargetSelectors pkgs mfilter [targetStr] >>= \ case
371
386
Left [problem] -> pure $ Left problem
372
387
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*."
375
390
376
391
-- ----------------------------------------------------------------------------
377
392
-- JSON serialisation helpers
0 commit comments