@@ -277,24 +277,6 @@ bool DataSpecUtils::partialMatch(OutputSpec const& output, header::DataDescripti
277277 return dataType.description == description;
278278}
279279
280- ConcreteDataMatcher DataSpecUtils::asConcreteDataMatcher (InputSpec const & spec)
281- {
282- return std::get<ConcreteDataMatcher>(spec.matcher );
283- }
284-
285- ConcreteDataMatcher DataSpecUtils::asConcreteDataMatcher (OutputSpec const & spec)
286- {
287- return std::get<ConcreteDataMatcher>(spec.matcher );
288- }
289-
290- ConcreteDataTypeMatcher DataSpecUtils::asConcreteDataTypeMatcher (OutputSpec const & spec)
291- {
292- return std::visit ([](auto const & concrete) {
293- return ConcreteDataTypeMatcher{concrete.origin , concrete.description };
294- },
295- spec.matcher );
296- }
297-
298280struct MatcherInfo {
299281 header::DataOrigin origin = header::gDataOriginInvalid ; // Whether or not we found an origins (should be a bad query!)
300282 header::DataDescription description = header::gDataDescriptionInvalid ; // Whether or not we found a description
@@ -383,6 +365,36 @@ MatcherInfo extractMatcherInfo(DataDescriptorMatcher const& top)
383365 return state;
384366}
385367
368+ ConcreteDataMatcher DataSpecUtils::asConcreteDataMatcher (InputSpec const & spec)
369+ {
370+ return std::visit (overloaded{[](ConcreteDataMatcher const & concrete) {
371+ return concrete;
372+ },
373+ [&binding = spec.binding ](DataDescriptorMatcher const & matcher) {
374+ auto info = extractMatcherInfo (matcher);
375+ if (info.hasOrigin && info.hasUniqueOrigin &&
376+ info.hasDescription && info.hasDescription &&
377+ info.hasSubSpec && info.hasUniqueSubSpec ) {
378+ return ConcreteDataMatcher{info.origin , info.description , info.subSpec };
379+ }
380+ throw std::runtime_error (" Cannot convert " + binding + " to ConcreteDataMatcher" );
381+ }},
382+ spec.matcher );
383+ }
384+
385+ ConcreteDataMatcher DataSpecUtils::asConcreteDataMatcher (OutputSpec const & spec)
386+ {
387+ return std::get<ConcreteDataMatcher>(spec.matcher );
388+ }
389+
390+ ConcreteDataTypeMatcher DataSpecUtils::asConcreteDataTypeMatcher (OutputSpec const & spec)
391+ {
392+ return std::visit ([](auto const & concrete) {
393+ return ConcreteDataTypeMatcher{concrete.origin , concrete.description };
394+ },
395+ spec.matcher );
396+ }
397+
386398ConcreteDataTypeMatcher DataSpecUtils::asConcreteDataTypeMatcher (InputSpec const & spec)
387399{
388400 return std::visit (overloaded{
0 commit comments