|
9 | 9 | import io.cucumber.gherkin.GherkinDialectProvider;
|
10 | 10 | import io.cucumber.gherkin.ParserException;
|
11 | 11 | import io.cucumber.messages.Messages;
|
| 12 | +import io.cucumber.messages.Messages.Envelope; |
12 | 13 | import io.cucumber.messages.Messages.GherkinDocument;
|
13 | 14 |
|
14 | 15 | import java.net.URI;
|
15 | 16 | import java.util.ArrayList;
|
16 | 17 | import java.util.List;
|
| 18 | +import java.util.Optional; |
17 | 19 | import java.util.UUID;
|
18 | 20 | import java.util.function.Supplier;
|
19 | 21 |
|
|
24 | 26 | public final class GherkinMessagesFeatureParser implements FeatureParser {
|
25 | 27 |
|
26 | 28 | @Override
|
27 |
| - public Feature parse(URI path, String source, Supplier<UUID> idGenerator) { |
| 29 | + public Optional<Feature> parse(URI path, String source, Supplier<UUID> idGenerator) { |
28 | 30 | try {
|
29 |
| - CucumberQuery cucumberQuery = new CucumberQuery(); |
30 | 31 |
|
31 |
| - List<Messages.Envelope> sources = singletonList( |
| 32 | + List<Envelope> sources = singletonList( |
32 | 33 | makeSourceEnvelope(source, path.toString())
|
33 | 34 | );
|
34 | 35 |
|
35 |
| - List<Messages.Envelope> envelopes = Gherkin.fromSources( |
| 36 | + List<Envelope> envelopes = Gherkin.fromSources( |
36 | 37 | sources,
|
37 | 38 | true,
|
38 | 39 | true,
|
39 | 40 | true,
|
40 | 41 | () -> idGenerator.get().toString()
|
41 | 42 | ).collect(toList());
|
42 | 43 |
|
43 |
| - GherkinDialect dialect = null; |
44 |
| - GherkinDocument gherkinDocument = null; |
45 |
| - List<Pickle> pickles = new ArrayList<>(); |
46 |
| - for (Messages.Envelope envelope : envelopes) { |
47 |
| - if (envelope.hasGherkinDocument()) { |
48 |
| - gherkinDocument = envelope.getGherkinDocument(); |
49 |
| - cucumberQuery.update(gherkinDocument); |
50 |
| - GherkinDialectProvider dialectProvider = new GherkinDialectProvider(); |
51 |
| - String language = gherkinDocument.getFeature().getLanguage(); |
52 |
| - dialect = dialectProvider.getDialect(language, null); |
53 |
| - } |
54 |
| - if (envelope.hasPickle()) { |
55 |
| - Messages.Pickle pickle = envelope.getPickle(); |
56 |
| - pickles.add(new GherkinMessagesPickle(pickle, path, dialect, cucumberQuery)); |
57 |
| - } |
| 44 | + GherkinDocument gherkinDocument = envelopes.stream() |
| 45 | + .filter(Envelope::hasGherkinDocument) |
| 46 | + .map(Envelope::getGherkinDocument) |
| 47 | + .findFirst() |
| 48 | + .orElse(null); |
| 49 | + |
| 50 | + if (gherkinDocument == null || !gherkinDocument.hasFeature()) { |
| 51 | + return Optional.empty(); |
58 | 52 | }
|
59 | 53 |
|
60 |
| - return new GherkinMessagesFeature(gherkinDocument, path, source, pickles, envelopes); |
| 54 | + CucumberQuery cucumberQuery = new CucumberQuery(); |
| 55 | + cucumberQuery.update(gherkinDocument); |
| 56 | + GherkinDialectProvider dialectProvider = new GherkinDialectProvider(); |
| 57 | + String language = gherkinDocument.getFeature().getLanguage(); |
| 58 | + GherkinDialect dialect = dialectProvider.getDialect(language, null); |
| 59 | + |
| 60 | + List<Messages.Pickle> pickleMessages = envelopes.stream() |
| 61 | + .filter(Envelope::hasPickle) |
| 62 | + .map(Envelope::getPickle) |
| 63 | + .collect(toList()); |
| 64 | + |
| 65 | + if (pickleMessages.isEmpty()) { |
| 66 | + return Optional.empty(); |
| 67 | + } |
| 68 | + |
| 69 | + List<Pickle> pickles = pickleMessages.stream() |
| 70 | + .map(pickle -> new GherkinMessagesPickle(pickle, path, dialect, cucumberQuery)) |
| 71 | + .collect(toList()); |
| 72 | + |
| 73 | + GherkinMessagesFeature feature = new GherkinMessagesFeature( |
| 74 | + gherkinDocument, |
| 75 | + path, |
| 76 | + source, |
| 77 | + pickles, |
| 78 | + envelopes |
| 79 | + ); |
| 80 | + return Optional.of(feature); |
61 | 81 | } catch (ParserException e) {
|
62 | 82 | throw new FeatureParserException("Failed to parse resource at: " + path.toString(), e);
|
63 | 83 | }
|
|
0 commit comments