From d2361056defd4e446fea41167d732de621976c9a Mon Sep 17 00:00:00 2001 From: Andrea Altea Date: Sat, 2 Mar 2019 17:19:28 +0100 Subject: [PATCH] Feat: prepare filter parameters in BeersRequest --- Example/Pods/Pods.xcodeproj/project.pbxproj | 2 +- PunkAPI/Classes/Request/BeersRequest.swift | 36 ++++++++-- .../Parameter/BeersRequestParameter.swift | 68 ++++++++++--------- .../Request/Parameter/DateParameter.swift | 2 +- .../Request/Parameter/FloatParameter.swift | 2 +- .../Request/Parameter/RequestParameter.swift | 27 ++++---- 6 files changed, 83 insertions(+), 54 deletions(-) diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index 5d1186f..7b27a13 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -221,10 +221,10 @@ isa = PBXGroup; children = ( 9767CC1B222ADDD100E684C4 /* RequestParameter.swift */, - 9767CC18222AC45900E684C4 /* BeersRequestParameter.swift */, 9767CC1F222ADE2500E684C4 /* FloatParameter.swift */, 9767CC21222ADE5100E684C4 /* StringParameter.swift */, 9767CC23222ADE6800E684C4 /* DateParameter.swift */, + 9767CC18222AC45900E684C4 /* BeersRequestParameter.swift */, ); path = Parameter; sourceTree = ""; diff --git a/PunkAPI/Classes/Request/BeersRequest.swift b/PunkAPI/Classes/Request/BeersRequest.swift index 9b94108..ce1ed0a 100644 --- a/PunkAPI/Classes/Request/BeersRequest.swift +++ b/PunkAPI/Classes/Request/BeersRequest.swift @@ -7,19 +7,43 @@ import UIKit -class BeersRequest { +public struct BeersRequest { - var page: Int - - init(page: Int = 0) { + public var page: Int + public var filter: [BeersRequest.Parameter] + + public init(filter:[BeersRequest.Parameter] = [], page: Int = 0) { + self.filter = filter self.page = page } - } extension BeersRequest: Request { - var path: String { + public var path: String { return "beers" } + + public var parameters: [String: Any]? { + + if var filter = filterParameters { + filter["page"] = page + return filter + } + return ["page": page] + } +} + +extension BeersRequest { + + var filterParameters: [String: Any]? { + + if filter.isEmpty { return nil } + + return filter.map { parameter -> RequestParameter in + return parameter.parameter + }.reduce(into: [:], { (result, parameter) in + result[parameter.key] = parameter.value + }) + } } diff --git a/PunkAPI/Classes/Request/Parameter/BeersRequestParameter.swift b/PunkAPI/Classes/Request/Parameter/BeersRequestParameter.swift index 1670b8d..e2a2c11 100644 --- a/PunkAPI/Classes/Request/Parameter/BeersRequestParameter.swift +++ b/PunkAPI/Classes/Request/Parameter/BeersRequestParameter.swift @@ -9,7 +9,7 @@ import Foundation extension BeersRequest { - public enum Parameter { + public enum Parameter { case abv(condition: Condition, value: Float) case ibu(condition: Condition, value: Float) @@ -19,41 +19,45 @@ extension BeersRequest { case yeast(value: String) case brewed(condition: Condition, value: Date) - - case hops(value: String) + + case hops(value: String) case malt(value: String) case food(value: String) + + case ids(value: [Int]) + } +} + +extension BeersRequest.Parameter { - case ids(value: [Int]) - internal var parameter: RequestParameter { - switch self { - case let .abv(condition, value): - return FloatParameter(key: "abv", condition: condition, value: value) - case let .ibu(condition, value): - return FloatParameter(key: "ibu", condition: condition, value: value) - case let .ebc(condition, value): - return FloatParameter(key: "ebc", condition: condition, value: value) - - case let .beerName(value): - return StringParameter(key: "beer_name", value: value) - case let .yeast(value): - return StringParameter(key: "yeast", value: value) - - case let .brewed(condition, value): - return DateParameter(type: "brewed", condition: condition, dateValue: value) - - case let .hops(value): - return StringParameter(key: "hops", value: value) - case let .malt(value): - return StringParameter(key: "malt", value: value) - case let .food(value): - return StringParameter(key: "food", value: value) - - case let .ids(value): - let ids = value.map { "\($0)" }.reduce("", { $0.isEmpty ? $1 : $0 + "|" + $1 }) - return StringParameter(key: "ids", value: ids) - } + internal var parameter: RequestParameter { + switch self { + case let .abv(condition, value): + return FloatParameter(key: "abv", condition: condition, value: value) + case let .ibu(condition, value): + return FloatParameter(key: "ibu", condition: condition, value: value) + case let .ebc(condition, value): + return FloatParameter(key: "ebc", condition: condition, value: value) + + case let .beerName(value): + return StringParameter(key: "beer_name", value: value) + case let .yeast(value): + return StringParameter(key: "yeast", value: value) + + case let .brewed(condition, value): + return DateParameter(type: "brewed", condition: condition, dateValue: value) + + case let .hops(value): + return StringParameter(key: "hops", value: value) + case let .malt(value): + return StringParameter(key: "malt", value: value) + case let .food(value): + return StringParameter(key: "food", value: value) + + case let .ids(value): + let ids = value.map { "\($0)" }.reduce("", { $0.isEmpty ? $1 : $0 + "|" + $1 }) + return StringParameter(key: "ids", value: ids) } } } diff --git a/PunkAPI/Classes/Request/Parameter/DateParameter.swift b/PunkAPI/Classes/Request/Parameter/DateParameter.swift index 9e79291..302830b 100644 --- a/PunkAPI/Classes/Request/Parameter/DateParameter.swift +++ b/PunkAPI/Classes/Request/Parameter/DateParameter.swift @@ -20,7 +20,7 @@ struct DateParameter: RequestParameter { var dateValue: Date var key: String { - return "\(type)_\(condition.literal)" + return "\(type)_\(condition.time)" } var value: Any { diff --git a/PunkAPI/Classes/Request/Parameter/FloatParameter.swift b/PunkAPI/Classes/Request/Parameter/FloatParameter.swift index 82cbc1e..014c24f 100644 --- a/PunkAPI/Classes/Request/Parameter/FloatParameter.swift +++ b/PunkAPI/Classes/Request/Parameter/FloatParameter.swift @@ -18,7 +18,7 @@ struct FloatParameter: RequestParameter { self.value = value } var key: String { - return "\(type)_\(condition.literal)" + return "\(type)_\(condition.dimension)" } } diff --git a/PunkAPI/Classes/Request/Parameter/RequestParameter.swift b/PunkAPI/Classes/Request/Parameter/RequestParameter.swift index 648c5fd..407ef9a 100644 --- a/PunkAPI/Classes/Request/Parameter/RequestParameter.swift +++ b/PunkAPI/Classes/Request/Parameter/RequestParameter.swift @@ -13,23 +13,24 @@ protocol RequestParameter { var value: Any { get } } -extension Array where Element: RequestParameter { - - var parameters: [String: Any] { - return self.reduce(into: [:], { (result, parameter) in - result[parameter.key] = parameter.value - }) - } +public enum Condition { + case more + case less } -enum Condition { - case greater - case lower +extension Condition { - var literal: String { + var dimension: String { + switch self { + case .more: return "gt" + case .less: return "lt" + } + } + + var time: String { switch self { - case .greater: return "gt" - case .lower: return "lt" + case .more: return "after" + case .less: return "before" } } }