@@ -18,78 +18,88 @@ import SemanticVersion
1818
1919enum Parser {
2020
21- static let dependencyStart = Int . parser ( ) . skip ( " dependenc " )
21+ static let dependencyStart = Parse {
22+ Int . parser ( )
23+ Skip { " dependenc " }
24+ }
2225
23- static let progressLine = Not ( dependencyStart) . skip ( PrefixThrough ( " \n " ) )
24-
25- static let progress = Many ( progressLine)
26+ static let progressLine = Parse {
27+ Not { dependencyStart }
28+ Skip { PrefixThrough ( " \n " ) }
29+ }
2630
27- static let dependencyCount = Int . parser ( )
28- . skip (
29- " dependency has changed: "
30- . orElse ( " dependencies have changed: " )
31- . orElse ( " dependencies have changed. " )
32- )
31+ static let progress = Many { progressLine }
3332
34- static let semanticVersion = Prefix ( while: { $0 != " " } )
35- . flatMap { str -> Conditional < Always < Substring , SemanticVersion > , Fail < Substring , SemanticVersion > > in
36- if let s = SemanticVersion . init ( String ( str) ) {
37- return Conditional . first ( Always ( s) )
38- } else {
39- return Conditional . second ( Fail ( ) )
33+ static let dependencyCount = Parse {
34+ Int . parser ( )
35+ Skip {
36+ OneOf {
37+ " dependency has changed: "
38+ " dependencies have changed: "
39+ " dependencies have changed. "
4040 }
4141 }
42- . map { Revision . tag ( $0 ) }
42+ }
4343
44- static let revision = semanticVersion
45- . orElse ( Prefix { $0 != " " } . map { . branch( String ( $0) ) } )
44+ static let semanticVersion = Parse ( Revision . tag) {
45+ Prefix { $0 != " " }
46+ . map { ( s: Substring ) -> String in return String . init ( s) }
47+ . compactMap ( SemanticVersion . init)
48+ }
49+
50+ static let revision = OneOf {
51+ semanticVersion
52+ Prefix { $0 != " " }
53+ . map ( String . init)
54+ . map ( Revision . branch)
55+ }
4656
4757 static let newPackageToken : Character = " + "
4858 static let updatedRevisionToken : Character = " ~ "
49- static let upToStart = Prefix { $0 != newPackageToken && $0 != updatedRevisionToken }
50-
51- static let newPackage = Skip ( upToStart)
52- . skip ( " \( newPackageToken) " )
53- . take ( Prefix { $0 != " " } . map ( String . init) )
54- . skip ( Prefix { $0 != " \n " } )
55- . map { Update ( packageName: $0, oldRevision: nil ) }
56-
57- static let updatedRevision = Skip ( upToStart)
58- . skip ( " \( updatedRevisionToken) " )
59- . take ( Prefix { $0 != " " } . map ( String . init) )
60- . skip ( " " )
61- . take ( revision)
62- . skip ( " -> " )
63- . skip ( Prefix { $0 != " \n " } )
64- . map ( Update . init ( packageName: oldRevision: ) )
65-
66- static let update = updatedRevision. orElse ( newPackage)
67-
68- static let updates = Many ( update, separator: " \n " )
59+ static let upToStart = Parse {
60+ Prefix { $0 != newPackageToken && $0 != updatedRevisionToken }
61+ }
6962
70- static let packageUpdate = Skip ( progress)
71- . skip ( Many ( " \n " ) )
72- . take ( dependencyCount)
73- . take ( updates)
74- . map { ( count, updates) -> [ Update ] in
75- assert ( updates. count == count)
76- return updates
63+ static let newPackage = Parse { Update ( packageName: $0, oldRevision: nil ) } with: {
64+ Skip {
65+ upToStart
66+ " \( newPackageToken) "
7767 }
68+ Prefix { $0 != " " } . map ( String . init)
69+ Skip {
70+ Prefix { $0 != " \n " }
71+ }
72+ }
7873
79- }
80-
81-
82- struct Not < P> : Parsing . Parser where P: Parsing . Parser {
83- let parser : P
74+ static let updatedRevision = Parse ( Update . init ( packageName: oldRevision: ) ) {
75+ Skip {
76+ upToStart
77+ " \( updatedRevisionToken) "
78+ }
79+ Prefix { $0 != " " } . map ( String . init)
80+ Skip { " " }
81+ revision
82+ Skip {
83+ " -> "
84+ Prefix { $0 != " \n " }
85+ }
86+ }
8487
85- init ( _ parser: P ) { self . parser = parser }
88+ static let update = OneOf {
89+ updatedRevision
90+ newPackage
91+ }
8692
87- func parse( _ input: inout P . Input ) -> Void ? {
88- let original = input
89- if parser. parse ( & input) != nil {
90- input = original
91- return nil
92- }
93- return ( )
93+ static let updates = Many ( element: { update } , separator: { " \n " } )
94+
95+ static let packageUpdate = Parse { ( count, updates) -> [ Update ] in
96+ assert ( updates. count == count)
97+ return updates
98+ } with: {
99+ Skip { progress }
100+ Skip { Many { " \n " } }
101+ dependencyCount
102+ updates
103+ Skip { Many { " \n " } }
94104 }
95105}
0 commit comments