@@ -3,37 +3,63 @@ import Foundation
33
44enum AlphaVantageAPI : URLConvertible {
55 private static let baseURLString = " https://www.alphavantage.co/query "
6-
6+
77 case globalQuote( symbol: String , apiKey: String )
88 case currencyExchangeRate( from: String , to: String , apiKey: String )
99 case symbolSearch( keywords: String , apiKey: String )
10-
11- func asURL( ) throws -> URL {
12- let url = try AlphaVantageAPI . baseURLString. asURL ( )
13-
14- switch self {
15- case . globalQuote( let symbol, let apiKey) :
16- return url. appending ( " function " , value: " GLOBAL_QUOTE " )
17- . appending ( " symbol " , value: symbol)
18- . appending ( " apikey " , value: apiKey)
19- case . currencyExchangeRate( let base, let target, let apiKey) :
20- return url. appending ( " function " , value: " CURRENCY_EXCHANGE_RATE " )
21- . appending ( " from_currency " , value: base)
22- . appending ( " to_currency " , value: target)
23- . appending ( " apikey " , value: apiKey)
24- case . symbolSearch( let keywords, let apiKey) :
25- return url. appending ( " function " , value: " SYMBOL_SEARCH " )
26- . appending ( " keywords " , value: keywords)
27- . appending ( " apikey " , value: apiKey)
28- }
29- }
10+ case dailyAdjustedTimeSeries( symbol: String , apiKey: String )
11+
12+ private var functionName : String {
13+ switch self {
14+ case . globalQuote: " GLOBAL_QUOTE "
15+ case . currencyExchangeRate: " CURRENCY_EXCHANGE_RATE "
16+ case . symbolSearch: " SYMBOL_SEARCH "
17+ case . dailyAdjustedTimeSeries: " TIME_SERIES_DAILY_ADJUSTED "
18+ }
19+ }
20+
21+ fileprivate enum Parameter : String {
22+ case symbol
23+ case apiKey = " apikey "
24+ case function
25+ case fromCurrency = " from_currency "
26+ case toCurrency = " to_currency "
27+ case keywords
28+ }
29+
30+ func asURL( ) throws -> URL {
31+ let url = try AlphaVantageAPI . baseURLString. asURL ( )
32+
33+ switch self {
34+ case . globalQuote( let symbol, let apiKey) :
35+ return url. appendingParameter ( . function, value: functionName)
36+ . appendingParameter ( . symbol, value: symbol)
37+ . appendingParameter ( . apiKey, value: apiKey)
38+
39+ case . currencyExchangeRate( let base, let target, let apiKey) :
40+ return url. appendingParameter ( . function, value: functionName)
41+ . appendingParameter ( . fromCurrency, value: base)
42+ . appendingParameter ( . toCurrency, value: target)
43+ . appendingParameter ( . apiKey, value: apiKey)
44+
45+ case . symbolSearch( let keywords, let apiKey) :
46+ return url. appendingParameter ( . function, value: functionName)
47+ . appendingParameter ( . keywords, value: keywords)
48+ . appendingParameter ( . apiKey, value: apiKey)
49+
50+ case . dailyAdjustedTimeSeries( let symbol, let apiKey) :
51+ return url. appendingParameter ( . function, value: functionName)
52+ . appendingParameter ( . symbol, value: symbol)
53+ . appendingParameter ( . apiKey, value: apiKey)
54+ }
55+ }
3056}
3157
3258fileprivate extension URL {
33- func appending ( _ queryItem : String , value: String ) -> URL {
59+ func appendingParameter ( _ parameter : AlphaVantageAPI . Parameter , value: String ) -> URL {
3460 guard var urlComponents = URLComponents ( string: absoluteString) else { return absoluteURL }
3561 var queryItems : [ URLQueryItem ] = urlComponents. queryItems ?? [ ]
36- let queryItem = URLQueryItem ( name: queryItem , value: value)
62+ let queryItem = URLQueryItem ( name: parameter . rawValue , value: value)
3763 queryItems. append ( queryItem)
3864 urlComponents. queryItems = queryItems
3965 return urlComponents. url!
0 commit comments