Skip to content

Commit 4a6e702

Browse files
Merge pull request #8 from diederich/feature/swift-parsing-0.8.0
update to new swift-parsing API
2 parents 7a2ea33 + c6d1fe3 commit 4a6e702

File tree

4 files changed

+147
-162
lines changed

4 files changed

+147
-162
lines changed

Package.resolved

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Sources/ReleaseNotesCore/Parser.swift

Lines changed: 69 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -18,78 +18,88 @@ import SemanticVersion
1818

1919
enum 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
}

Sources/ReleaseNotesCore/ReleaseNotes.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,13 @@ struct ReleaseNotes: AsyncParsableCommand {
3535
return
3636
}
3737

38-
guard let updates = Parser.packageUpdate.parse(output) else {
38+
let updates: [Update]
39+
do {
40+
updates = try Parser.packageUpdate.parse(output)
41+
} catch {
3942
print("Failed to parse results from package update.\n")
4043
print("Please file an issue with the the output above.")
41-
return
44+
throw error
4245
}
4346

4447
guard !updates.isEmpty else {

0 commit comments

Comments
 (0)