@@ -15,20 +15,20 @@ public import Foundation
1515
1616public protocol ExpressibleByParsing {
1717 @lifetime ( & input)
18- init ( parsing input: inout ParserSpan ) throws
18+ init ( parsing input: inout ParserSpan ) throws ( ThrownParsingError )
1919}
2020
2121extension ExpressibleByParsing {
22- public init ( parsing data: some RandomAccessCollection < UInt8 > ) throws {
22+ public init ( parsing data: some RandomAccessCollection < UInt8 > )
23+ throws ( ThrownParsingError)
24+ {
2325 guard
24- let result = try data. withParserSpanIfAvailable ( { span in
26+ let result = try data. withParserSpanIfAvailable ( {
27+ ( span) throws ( ThrownParsingError) in
2528 try Self . init ( parsing: & span)
2629 } )
2730 else {
28- throw ParsingError (
29- status: . invalidValue,
30- location: 0 ,
31- message: " Provided data type does not support contiguous access. " )
31+ throw ParsingError ( statusOnly: . invalidValue)
3232 }
3333 self = result
3434 }
@@ -37,81 +37,113 @@ extension ExpressibleByParsing {
3737extension RandomAccessCollection < UInt8 > {
3838 @inlinable
3939 public func withParserSpanIfAvailable< T> (
40- _ body: ( inout ParserSpan ) throws -> T
41- ) throws -> T ? {
40+ _ body: ( inout ParserSpan ) throws ( ThrownParsingError ) -> T
41+ ) throws ( ThrownParsingError ) -> T ? {
4242 #if canImport(Foundation)
4343 if let data = self as? Foundation . Data {
44- return try data. withUnsafeBytes { buffer -> T in
45- var span = ParserSpan ( _unsafeBytes: buffer)
46- return try body ( & span)
44+ do {
45+ return try data. withUnsafeBytes { buffer -> T in
46+ var span = ParserSpan ( _unsafeBytes: buffer)
47+ return try body ( & span)
48+ }
49+ } catch {
50+ // Workaround for lack of typed-throwing API on Data
51+ // swift-format-ignore: NeverForceUnwrap
52+ throw error as! ThrownParsingError
4753 }
4854 }
4955 #endif
50- return try self . withContiguousStorageIfAvailable { buffer in
51- let rawBuffer = UnsafeRawBufferPointer ( buffer)
52- var span = ParserSpan ( _unsafeBytes: rawBuffer)
53- return try body ( & span)
56+ do {
57+ return try self . withContiguousStorageIfAvailable { buffer in
58+ let rawBuffer = UnsafeRawBufferPointer ( buffer)
59+ var span = ParserSpan ( _unsafeBytes: rawBuffer)
60+ return try body ( & span)
61+ }
62+ } catch {
63+ // Workaround for lack of typed-throwing API on Collection
64+ // swift-format-ignore: NeverForceUnwrap
65+ throw error as! ThrownParsingError
5466 }
5567 }
5668}
5769
5870// MARK: ParserSpanProvider
5971
6072public protocol ParserSpanProvider {
61- func withParserSpan< T> ( _ body: ( inout ParserSpan ) throws -> T ) throws -> T
73+ func withParserSpan< T> (
74+ _ body: ( inout ParserSpan ) throws ( ThrownParsingError ) -> T
75+ ) throws ( ThrownParsingError) -> T
6276}
6377
6478#if canImport(Foundation)
6579extension Data : ParserSpanProvider {
6680 @inlinable
67- public func withParserSpan< T> ( _ body: ( inout ParserSpan ) throws -> T ) throws
68- -> T
69- {
70- try withUnsafeBytes { buffer -> T in
71- // FIXME: RawSpan getter
72- // var span = ParserSpan(buffer.bytes)
73- var span = ParserSpan ( _unsafeBytes: buffer)
74- return try body ( & span)
81+ public func withParserSpan< T> (
82+ _ body: ( inout ParserSpan ) throws ( ThrownParsingError ) -> T
83+ ) throws ( ThrownParsingError) -> T {
84+ do {
85+ return try withUnsafeBytes { buffer -> T in
86+ // FIXME: RawSpan getter
87+ // var span = ParserSpan(buffer.bytes)
88+ var span = ParserSpan ( _unsafeBytes: buffer)
89+ return try body ( & span)
90+ }
91+ } catch {
92+ // Workaround for lack of typed-throwing API on Data
93+ // swift-format-ignore: NeverForceUnwrap
94+ throw error as! ThrownParsingError
7595 }
7696 }
7797
7898 @_alwaysEmitIntoClient
7999 @inlinable
80100 public func withParserSpan< T> (
81101 usingRange range: inout ParserRange ,
82- _ body: ( inout ParserSpan ) throws -> T
83- ) rethrows -> T {
84- try withUnsafeBytes { buffer -> T in
85- // FIXME: RawSpan getter
86- // var span = try ParserSpan(buffer.bytes)
87- var span = try ParserSpan ( _unsafeBytes: buffer)
88- . seeking ( toRange: range)
89- defer {
90- range = span. parserRange
102+ _ body: ( inout ParserSpan ) throws ( ThrownParsingError ) -> T
103+ ) throws ( ThrownParsingError) -> T {
104+ do {
105+ return try withUnsafeBytes { ( buffer) throws ( ThrownParsingError) -> T in
106+ // FIXME: RawSpan getter
107+ // var span = try ParserSpan(buffer.bytes)
108+ var span = try ParserSpan ( _unsafeBytes: buffer)
109+ . seeking ( toRange: range)
110+ defer {
111+ range = span. parserRange
112+ }
113+ return try body ( & span)
91114 }
92- return try body ( & span)
115+ } catch {
116+ // Workaround for lack of typed-throwing API on Data
117+ // swift-format-ignore: NeverForceUnwrap
118+ throw error as! ThrownParsingError
93119 }
94120 }
95121}
96122#endif
97123
98124extension ParserSpanProvider where Self: RandomAccessCollection < UInt8 > {
99125 @inlinable
100- public func withParserSpan< T> ( _ body: ( inout ParserSpan ) throws -> T ) throws
101- -> T
102- {
103- guard
104- let result = try self . withContiguousStorageIfAvailable ( { buffer in
105- // FIXME: RawSpan getter
106- // var span = ParserSpan(UnsafeRawBufferPointer(buffer).bytes)
107- let rawBuffer = UnsafeRawBufferPointer ( buffer)
108- var span = ParserSpan ( _unsafeBytes: rawBuffer)
109- return try body ( & span)
110- } )
111- else {
112- throw ParsingError ( status: . userError, location: 0 )
126+ public func withParserSpan< T> (
127+ _ body: ( inout ParserSpan ) throws ( ThrownParsingError ) -> T
128+ ) throws ( ThrownParsingError) -> T {
129+ do {
130+ guard
131+ let result = try self . withContiguousStorageIfAvailable ( { buffer in
132+ // FIXME: RawSpan getter
133+ // var span = ParserSpan(UnsafeRawBufferPointer(buffer).bytes)
134+ let rawBuffer = UnsafeRawBufferPointer ( buffer)
135+ var span = ParserSpan ( _unsafeBytes: rawBuffer)
136+ return try body ( & span)
137+ } )
138+ else {
139+ throw ParsingError ( status: . userError, location: 0 )
140+ }
141+ return result
142+ } catch {
143+ // Workaround for lack of typed-throwing API on Collection
144+ // swift-format-ignore: NeverForceUnwrap
145+ throw error as! ThrownParsingError
113146 }
114- return result
115147 }
116148}
117149
0 commit comments