@@ -8,7 +8,9 @@ module Distribution.Client.CmdBench (
8
8
benchAction ,
9
9
10
10
-- * Internals exposed for testing
11
- TargetProblem (.. ),
11
+ componentNotBenchmarkProblem ,
12
+ isSubComponentProblem ,
13
+ noBenchmarksProblem ,
12
14
selectPackageTargets ,
13
15
selectComponentTarget
14
16
) where
@@ -18,7 +20,11 @@ import Prelude ()
18
20
19
21
import Distribution.Client.ProjectOrchestration
20
22
import Distribution.Client.CmdErrorMessages
21
-
23
+ ( renderTargetSelector , showTargetSelector , renderTargetProblem ,
24
+ renderTargetProblemNoTargets , plural , targetSelectorPluralPkgs ,
25
+ targetSelectorFilter )
26
+ import Distribution.Client.TargetProblem
27
+ ( TargetProblem (.. ) )
22
28
import Distribution.Client.NixStyleOptions
23
29
( NixStyleFlags (.. ), nixStyleOptions , defaultNixStyleFlags )
24
30
import Distribution.Client.Setup
@@ -98,7 +104,6 @@ benchAction flags@NixStyleFlags {..} targetStrings globalFlags = do
98
104
$ resolveTargets
99
105
selectPackageTargets
100
106
selectComponentTarget
101
- TargetProblemCommon
102
107
elaboratedPlan
103
108
Nothing
104
109
targetSelectors
@@ -126,7 +131,7 @@ benchAction flags@NixStyleFlags {..} targetStrings globalFlags = do
126
131
-- or fail if there are no benchmarks or no buildable benchmarks.
127
132
--
128
133
selectPackageTargets :: TargetSelector
129
- -> [AvailableTarget k ] -> Either TargetProblem [k ]
134
+ -> [AvailableTarget k ] -> Either BenchTargetProblem [k ]
130
135
selectPackageTargets targetSelector targets
131
136
132
137
-- If there are any buildable benchmark targets then we select those
@@ -139,7 +144,7 @@ selectPackageTargets targetSelector targets
139
144
140
145
-- If there are no benchmarks but some other targets then we report that
141
146
| not (null targets)
142
- = Left (TargetProblemNoBenchmarks targetSelector)
147
+ = Left (noBenchmarksProblem targetSelector)
143
148
144
149
-- If there are no targets at all then we report that
145
150
| otherwise
@@ -161,34 +166,27 @@ selectPackageTargets targetSelector targets
161
166
-- to the basic checks on being buildable etc.
162
167
--
163
168
selectComponentTarget :: SubComponentTarget
164
- -> AvailableTarget k -> Either TargetProblem k
169
+ -> AvailableTarget k -> Either BenchTargetProblem k
165
170
selectComponentTarget subtarget@ WholeComponent t
166
171
| CBenchName _ <- availableTargetComponentName t
167
- = either (Left . TargetProblemCommon ) return $
168
- selectComponentTargetBasic subtarget t
172
+ = selectComponentTargetBasic subtarget t
169
173
| otherwise
170
- = Left (TargetProblemComponentNotBenchmark (availableTargetPackageId t)
171
- (availableTargetComponentName t))
174
+ = Left (componentNotBenchmarkProblem
175
+ (availableTargetPackageId t)
176
+ (availableTargetComponentName t))
172
177
173
178
selectComponentTarget subtarget t
174
- = Left (TargetProblemIsSubComponent (availableTargetPackageId t)
175
- (availableTargetComponentName t)
176
- subtarget)
179
+ = Left (isSubComponentProblem
180
+ (availableTargetPackageId t)
181
+ (availableTargetComponentName t)
182
+ subtarget)
177
183
178
184
-- | The various error conditions that can occur when matching a
179
185
-- 'TargetSelector' against 'AvailableTarget's for the @bench@ command.
180
186
--
181
- data TargetProblem =
182
- TargetProblemCommon TargetProblemCommon
183
-
184
- -- | The 'TargetSelector' matches benchmarks but none are buildable
185
- | TargetProblemNoneEnabled TargetSelector [AvailableTarget () ]
186
-
187
- -- | There are no targets at all
188
- | TargetProblemNoTargets TargetSelector
189
-
187
+ data BenchProblem =
190
188
-- | The 'TargetSelector' matches targets but no benchmarks
191
- | TargetProblemNoBenchmarks TargetSelector
189
+ TargetProblemNoBenchmarks TargetSelector
192
190
193
191
-- | The 'TargetSelector' refers to a component that is not a benchmark
194
192
| TargetProblemComponentNotBenchmark PackageId ComponentName
@@ -197,42 +195,57 @@ data TargetProblem =
197
195
| TargetProblemIsSubComponent PackageId ComponentName SubComponentTarget
198
196
deriving (Eq , Show )
199
197
200
- reportTargetProblems :: Verbosity -> [TargetProblem ] -> IO a
201
- reportTargetProblems verbosity =
202
- die' verbosity . unlines . map renderTargetProblem
203
198
204
- renderTargetProblem :: TargetProblem -> String
205
- renderTargetProblem (TargetProblemCommon problem) =
206
- renderTargetProblemCommon " run" problem
199
+ type BenchTargetProblem = TargetProblem BenchProblem
207
200
208
- renderTargetProblem ( TargetProblemNoneEnabled targetSelector targets) =
209
- renderTargetProblemNoneEnabled " benchmark " targetSelector targets
201
+ noBenchmarksProblem :: TargetSelector -> TargetProblem BenchProblem
202
+ noBenchmarksProblem = CustomTargetProblem . TargetProblemNoBenchmarks
210
203
211
- renderTargetProblem (TargetProblemNoBenchmarks targetSelector) =
212
- " Cannot run benchmarks for the target '" ++ showTargetSelector targetSelector
213
- ++ " ' which refers to " ++ renderTargetSelector targetSelector
214
- ++ " because "
215
- ++ plural (targetSelectorPluralPkgs targetSelector) " it does" " they do"
216
- ++ " not contain any benchmarks."
204
+ componentNotBenchmarkProblem :: PackageId -> ComponentName -> TargetProblem BenchProblem
205
+ componentNotBenchmarkProblem pkgid name = CustomTargetProblem $
206
+ TargetProblemComponentNotBenchmark pkgid name
217
207
218
- renderTargetProblem (TargetProblemNoTargets targetSelector) =
208
+ isSubComponentProblem
209
+ :: PackageId
210
+ -> ComponentName
211
+ -> SubComponentTarget
212
+ -> TargetProblem BenchProblem
213
+ isSubComponentProblem pkgid name subcomponent = CustomTargetProblem $
214
+ TargetProblemIsSubComponent pkgid name subcomponent
215
+
216
+ reportTargetProblems :: Verbosity -> [BenchTargetProblem ] -> IO a
217
+ reportTargetProblems verbosity =
218
+ die' verbosity . unlines . map renderBenchTargetProblem
219
+
220
+ renderBenchTargetProblem :: BenchTargetProblem -> String
221
+ renderBenchTargetProblem (TargetProblemNoTargets targetSelector) =
219
222
case targetSelectorFilter targetSelector of
220
223
Just kind | kind /= BenchKind
221
224
-> " The bench command is for running benchmarks, but the target '"
222
225
++ showTargetSelector targetSelector ++ " ' refers to "
223
226
++ renderTargetSelector targetSelector ++ " ."
224
227
225
228
_ -> renderTargetProblemNoTargets " benchmark" targetSelector
229
+ renderBenchTargetProblem problem =
230
+ renderTargetProblem " benchmark" renderBenchProblem problem
231
+
232
+ renderBenchProblem :: BenchProblem -> String
233
+ renderBenchProblem (TargetProblemNoBenchmarks targetSelector) =
234
+ " Cannot run benchmarks for the target '" ++ showTargetSelector targetSelector
235
+ ++ " ' which refers to " ++ renderTargetSelector targetSelector
236
+ ++ " because "
237
+ ++ plural (targetSelectorPluralPkgs targetSelector) " it does" " they do"
238
+ ++ " not contain any benchmarks."
226
239
227
- renderTargetProblem (TargetProblemComponentNotBenchmark pkgid cname) =
240
+ renderBenchProblem (TargetProblemComponentNotBenchmark pkgid cname) =
228
241
" The bench command is for running benchmarks, but the target '"
229
242
++ showTargetSelector targetSelector ++ " ' refers to "
230
243
++ renderTargetSelector targetSelector ++ " from the package "
231
244
++ prettyShow pkgid ++ " ."
232
245
where
233
246
targetSelector = TargetComponent pkgid cname WholeComponent
234
247
235
- renderTargetProblem (TargetProblemIsSubComponent pkgid cname subtarget) =
248
+ renderBenchProblem (TargetProblemIsSubComponent pkgid cname subtarget) =
236
249
" The bench command can only run benchmarks as a whole, "
237
250
++ " not files or modules within them, but the target '"
238
251
++ showTargetSelector targetSelector ++ " ' refers to "
0 commit comments