Skip to content

Commit 9117336

Browse files
authored
Fix PublicationService.get() (#513)
1 parent f8785fb commit 9117336

File tree

7 files changed

+21
-15
lines changed

7 files changed

+21
-15
lines changed

Sources/Shared/Publication/Publication.swift

+5-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import CoreServices
88
import Foundation
9+
import ReadiumInternal
910

1011
/// Shared model for a Readium Publication.
1112
public class Publication: Closeable, Loggable {
@@ -90,8 +91,10 @@ public class Publication: Closeable, Loggable {
9091

9192
/// Returns the resource targeted by the given `href`.
9293
public func get<T: URLConvertible>(_ href: T) -> Resource? {
93-
// Try first the original href and falls back to href without query and fragment.
94-
container[href] ?? container[href.anyURL.removingQuery().removingFragment()]
94+
services.first { $0.get(href) }
95+
// Try first the original href and falls back to href without query and fragment.
96+
?? container[href]
97+
?? container[href.anyURL.removingQuery().removingFragment()]
9598
}
9699

97100
/// Closes any opened resource associated with the `Publication`, including `services`.

Sources/Shared/Publication/Services/Cover/GeneratedCoverService.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ public final class GeneratedCoverService: CoverService {
4343

4444
public var links: [Link] { [coverLink] }
4545

46-
public func get(link: Link) -> Resource? {
47-
guard link.href == coverLink.href else {
46+
public func get<T>(_ href: T) -> (any Resource)? where T: URLConvertible {
47+
guard href.anyURL.isEquivalentTo(coverLink.url()) else {
4848
return nil
4949
}
5050

Sources/Shared/Publication/Services/Positions/PositionsService.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ private let positionsLink = Link(
3333
public extension PositionsService {
3434
var links: [Link] { [positionsLink] }
3535

36-
func get(link: Link) -> Resource? {
37-
guard link.href == positionsLink.href else {
36+
func get<T>(_ href: T) -> (any Resource)? where T: URLConvertible {
37+
guard href.anyURL.isEquivalentTo(positionsLink.url()) else {
3838
return nil
3939
}
4040
return PositionsResource(positions: positions)

Sources/Shared/Publication/Services/PublicationService.swift

+6-3
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,17 @@ public protocol PublicationService: Closeable {
3131
///
3232
/// Called by `Publication.get()` for each request.
3333
///
34-
/// - Returns: The Resource containing the response, or null if the service doesn't recognize
35-
/// this request.
36-
func get(link: Link) -> Resource?
34+
/// - Returns: The Resource containing the response, or null if the service
35+
/// doesn't recognize this request.
36+
func get<T: URLConvertible>(_ href: T) -> Resource?
3737
}
3838

3939
public extension PublicationService {
4040
var links: [Link] { [] }
4141

42+
func get<T: URLConvertible>(_ href: T) -> Resource? { nil }
43+
44+
@available(*, unavailable, message: "Use get(URLConvertible) instead")
4245
func get(link: Link) -> Resource? { nil }
4346
}
4447

Tests/SharedTests/Publication/Services/Content Protection/ContentProtectionServiceTests.swift

+3-3
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class ContentProtectionServiceTests: XCTestCase {
1111
func testGetUnknown() {
1212
let service = TestContentProtectionService()
1313

14-
let resource = service.get(link: Link(href: "/unknown"))
14+
let resource = service.get(AnyURL(string: "/unknown")!)
1515

1616
XCTAssertNil(resource)
1717
}
@@ -93,11 +93,11 @@ struct TestContentProtectionService: ContentProtectionService {
9393
var name: LocalizedString? = nil
9494

9595
func getCopy(text: String, peek: Bool) throws -> Resource {
96-
try XCTUnwrap(get(link: Link(href: "~readium/rights/copy?text=\(text)&peek=\(peek)")))
96+
try XCTUnwrap(get(AnyURL(string: "~readium/rights/copy?text=\(text)&peek=\(peek)")!))
9797
}
9898

9999
func getPrint(pageCount: Int, peek: Bool) throws -> Resource {
100-
try XCTUnwrap(get(link: Link(href: "~readium/rights/print?pageCount=\(pageCount)&peek=\(peek)")))
100+
try XCTUnwrap(get(AnyURL(string: "~readium/rights/print?pageCount=\(pageCount)&peek=\(peek)")!))
101101
}
102102
}
103103

Tests/SharedTests/Publication/Services/Cover/GeneratedCoverServiceTests.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class GeneratedCoverServiceTests: XCTestCase {
2929
GeneratedCoverService(cover: cover),
3030
GeneratedCoverService(makeCover: { .success(self.cover) }),
3131
] {
32-
let resource = try XCTUnwrap(service.get(link: Link(href: "~readium/cover")))
32+
let resource = try XCTUnwrap(service.get(AnyURL(string: "~readium/cover")!))
3333
let result = await resource.read().map(UIImage.init)
3434
AssertImageEqual(result, .success(cover))
3535
}

Tests/SharedTests/Publication/Services/Positions/PositionsServiceTests.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ class PositionsServiceTests: XCTestCase {
123123
func testGetPositions() async throws {
124124
let service = TestPositionsService(positions)
125125

126-
let resource = service.get(link: Link(href: "~readium/positions"))
126+
let resource = service.get(AnyURL(string: "~readium/positions")!)
127127

128128
let result = try await resource?.readAsString().get()
129129
XCTAssertEqual(
@@ -137,7 +137,7 @@ class PositionsServiceTests: XCTestCase {
137137
func testGetUnknown() {
138138
let service = TestPositionsService(positions)
139139

140-
let resource = service.get(link: Link(href: "/unknown"))
140+
let resource = service.get(AnyURL(string: "/unknown")!)
141141

142142
XCTAssertNil(resource)
143143
}

0 commit comments

Comments
 (0)