From c63916df3aff04b2c56621deafabf11587c45af3 Mon Sep 17 00:00:00 2001 From: Alex Deem Date: Sun, 9 Jun 2024 22:32:36 +1000 Subject: [PATCH] Add SequenceVariableProvider --- .../ScreamURITemplate/VariableProvider.swift | 17 +++++++++++++++++ Tests/ScreamURITemplateTests/Tests.swift | 16 +++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/Sources/ScreamURITemplate/VariableProvider.swift b/Sources/ScreamURITemplate/VariableProvider.swift index 739d94b..2467e9c 100644 --- a/Sources/ScreamURITemplate/VariableProvider.swift +++ b/Sources/ScreamURITemplate/VariableProvider.swift @@ -20,3 +20,20 @@ public protocol VariableProvider { public typealias VariableDictionary = [String: VariableValue] extension VariableDictionary: VariableProvider {} + +public struct SequenceVariableProvider: VariableProvider, ExpressibleByArrayLiteral { + let sequence: any Sequence + + public init(arrayLiteral elements: VariableProvider...) { + sequence = elements + } + + public subscript(_ key: String) -> VariableValue? { + for provider in sequence { + if let value = provider[key] { + return value + } + } + return nil + } +} diff --git a/Tests/ScreamURITemplateTests/Tests.swift b/Tests/ScreamURITemplateTests/Tests.swift index 681c762..630a4ad 100644 --- a/Tests/ScreamURITemplateTests/Tests.swift +++ b/Tests/ScreamURITemplateTests/Tests.swift @@ -17,7 +17,12 @@ import XCTest struct TestVariableProvider: VariableProvider { subscript(_ key: String) -> VariableValue? { - return "_\(key)_" + switch key { + case "missing": + return nil + default: + return "_\(key)_" + } } } @@ -28,6 +33,15 @@ class Tests: XCTestCase { XCTAssertEqual(urlString, "https://api.github.com/repos/_owner_/_repo_/collaborators/_username_") } + func testSequenceVariableProvider() throws { + let template: URITemplate = "https://api.github.com/repos/{owner}/{repo}/collaborators/{username}{missing}" + let urlString = try template.process(variables: [ + ["owner": "SwiftScream"], + TestVariableProvider(), + ] as SequenceVariableProvider) + XCTAssertEqual(urlString, "https://api.github.com/repos/SwiftScream/_repo_/collaborators/_username_") + } + func testStringStringDictionary() throws { let template: URITemplate = "https://api.github.com/repos/{owner}/{repo}/collaborators/{username}" let variables = ["owner": "SwiftScream",