Skip to content

Commit b8b0d70

Browse files
committed
Merge branch '0.0.3'
2 parents f861ed5 + 02826b5 commit b8b0d70

14 files changed

+920
-82
lines changed

Sources/Amatino/Balance.swift

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
//
2+
// Balance.swift
3+
// Amatino
4+
//
5+
// Created by Hugh Jeremy on 18/7/18.
6+
//
7+
8+
import Foundation
9+
10+
class Balance: BalanceCore {
11+
12+
private static let path = "/accounts/balance"
13+
14+
public static func retrieve(
15+
session: Session,
16+
entity: Entity,
17+
account: Account,
18+
callback: @escaping (Error?, Balance?) -> Void
19+
) throws {
20+
21+
let arguments = BalanceRetrieveArguments(account: account)
22+
let _ = try Balance.retrieve(
23+
session: session,
24+
entity: entity,
25+
arguments: arguments,
26+
callback: callback
27+
)
28+
return
29+
}
30+
31+
public static func retrieve(
32+
session: Session,
33+
entity: Entity,
34+
account: Account,
35+
balanceTime: Date,
36+
callback: @escaping (Error?, Balance?) -> Void
37+
) throws {
38+
39+
let arguments = BalanceRetrieveArguments(
40+
account: account,
41+
balanceTime: balanceTime
42+
)
43+
let _ = try Balance.retrieve(
44+
session: session,
45+
entity: entity,
46+
arguments: arguments,
47+
callback: callback
48+
)
49+
return
50+
}
51+
52+
public static func retrieve(
53+
session: Session,
54+
entity: Entity,
55+
arguments: BalanceRetrieveArguments,
56+
callback: @escaping (Error?, Balance?) -> Void
57+
) throws {
58+
59+
let urlParameters = UrlParameters(singleEntity: entity)
60+
let requestData = try RequestData(data: arguments)
61+
let _ = try AmatinoRequest(
62+
path: path,
63+
data: requestData,
64+
session: session,
65+
urlParameters: urlParameters,
66+
method: .GET,
67+
callback: { (error, data) in
68+
let _ = loadResponse(error, data, callback)
69+
return
70+
})
71+
return
72+
}
73+
74+
private static func loadResponse(
75+
_ responseError: Error?,
76+
_ data: Data?,
77+
_ callback: (Error?, Balance?) -> Void
78+
) {
79+
guard responseError == nil else {callback(responseError, nil); return}
80+
let decoder = JSONDecoder()
81+
let balance: Balance
82+
do {
83+
balance = try decoder.decode(
84+
[Balance].self,
85+
from: data!
86+
)[0]
87+
callback(nil, balance)
88+
return
89+
} catch {
90+
callback(error, nil)
91+
}
92+
}
93+
94+
}

Sources/Amatino/BalanceCore.swift

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
//
2+
// BalanceCore.swift
3+
// Amatino
4+
//
5+
// Created by Hugh Jeremy on 18/7/18.
6+
//
7+
8+
import Foundation
9+
10+
class BalanceError: AmatinoObjectError {}
11+
12+
internal class BalanceCore: Decodable {
13+
14+
public let accountId: Int
15+
public let balanceTime: Date
16+
public let generatedTime: Date
17+
public let recursive: Bool
18+
public let globalUnitDenomination: Int?
19+
public let customUnitDenomination: Int?
20+
public let magnitude: Decimal
21+
22+
public required init(from decoder: Decoder) throws {
23+
let container = try decoder.container(keyedBy: CodingKeys.self)
24+
accountId = try container.decode(Int.self, forKey: .accountId)
25+
let formatter = DateFormatter()
26+
formatter.dateFormat = RequestData.dateStringFormat
27+
let rawBalanceTime = try container.decode(
28+
String.self,
29+
forKey: .balanceTime
30+
)
31+
guard let bTime: Date = formatter.date(from: rawBalanceTime) else {
32+
throw BalanceError(.incomprehensibleResponse)
33+
}
34+
balanceTime = bTime
35+
let rawGeneratedTime = try container.decode(
36+
String.self,
37+
forKey: .generatedTime
38+
)
39+
guard let gTime: Date = formatter.date(from: rawGeneratedTime) else {
40+
throw BalanceError(.incomprehensibleResponse)
41+
}
42+
generatedTime = gTime
43+
globalUnitDenomination = try container.decode(
44+
Int?.self,
45+
forKey: .globalUnitDenomination
46+
)
47+
customUnitDenomination = try container.decode(
48+
Int?.self,
49+
forKey: .customUnitDenomination
50+
)
51+
let rawMagnitude = try container.decode(String.self, forKey: .balance)
52+
let negative: Bool = rawMagnitude.contains("(")
53+
let parseMagnitude: String
54+
if negative == true {
55+
var magnitudeToStrip = rawMagnitude
56+
magnitudeToStrip.removeFirst()
57+
magnitudeToStrip.removeLast()
58+
parseMagnitude = "-" + magnitudeToStrip
59+
} else {
60+
parseMagnitude = rawMagnitude
61+
}
62+
guard let decimalMagnitude = Decimal(string: parseMagnitude) else {
63+
throw BalanceError(.incomprehensibleResponse)
64+
}
65+
magnitude = decimalMagnitude
66+
recursive = try container.decode(Bool.self, forKey: .recursive)
67+
return
68+
}
69+
70+
internal enum CodingKeys: String, CodingKey {
71+
case accountId = "account_id"
72+
case balanceTime = "balance_time"
73+
case generatedTime = "generated_time"
74+
case globalUnitDenomination = "global_unit_denomination"
75+
case customUnitDenomination = "custom_unit_denomination"
76+
case recursive
77+
case balance
78+
}
79+
80+
}
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
//
2+
// BalanceRetrieveArguments.swift
3+
// Amatino
4+
//
5+
// Created by Hugh Jeremy on 18/7/18.
6+
//
7+
8+
import Foundation
9+
10+
public struct BalanceRetrieveArguments: Encodable {
11+
12+
let accountId: Int
13+
let balanceTime: Date?
14+
let globalUnitDenominationId: Int?
15+
let customUnitDenominationId: Int?
16+
17+
public init(account: Account) {
18+
accountId = account.id
19+
balanceTime = nil
20+
globalUnitDenominationId = nil
21+
customUnitDenominationId = nil
22+
return
23+
}
24+
25+
public init(account: Account, balanceTime: Date) {
26+
accountId = account.id
27+
self.balanceTime = balanceTime
28+
globalUnitDenominationId = nil
29+
customUnitDenominationId = nil
30+
return
31+
}
32+
33+
public init(account: Account, globalUnitDenomination: GlobalUnit) {
34+
accountId = account.id
35+
self.balanceTime = nil
36+
globalUnitDenominationId = globalUnitDenomination.id
37+
customUnitDenominationId = nil
38+
return
39+
}
40+
41+
public init(
42+
account: Account,
43+
balanceTime: Date,
44+
globalUnitDenomination: GlobalUnit
45+
) {
46+
accountId = account.id
47+
self.balanceTime = balanceTime
48+
globalUnitDenominationId = globalUnitDenomination.id
49+
customUnitDenominationId = nil
50+
return
51+
}
52+
53+
public init(account: Account, globalUnitDenominationId: Int) {
54+
accountId = account.id
55+
self.balanceTime = nil
56+
self.globalUnitDenominationId = globalUnitDenominationId
57+
customUnitDenominationId = nil
58+
return
59+
}
60+
61+
public init(
62+
account: Account,
63+
balanceTime: Date,
64+
globalUnitDenominationId: Int
65+
) {
66+
accountId = account.id
67+
self.balanceTime = balanceTime
68+
self.globalUnitDenominationId = globalUnitDenominationId
69+
customUnitDenominationId = nil
70+
return
71+
}
72+
73+
public init(accountId: Int) {
74+
self.accountId = accountId
75+
balanceTime = nil
76+
globalUnitDenominationId = nil
77+
customUnitDenominationId = nil
78+
return
79+
}
80+
81+
public init(accountId: Int, balanceTime: Date) {
82+
self.accountId = accountId
83+
self.balanceTime = balanceTime
84+
globalUnitDenominationId = nil
85+
customUnitDenominationId = nil
86+
return
87+
}
88+
89+
public init(accountId: Int, globalUnitDenomination: GlobalUnit) {
90+
self.accountId = accountId
91+
self.balanceTime = nil
92+
globalUnitDenominationId = globalUnitDenomination.id
93+
customUnitDenominationId = nil
94+
return
95+
}
96+
97+
public init(
98+
accountId: Int,
99+
balanceTime: Date,
100+
globalUnitDenomination: GlobalUnit
101+
) {
102+
self.accountId = accountId
103+
self.balanceTime = balanceTime
104+
globalUnitDenominationId = globalUnitDenomination.id
105+
customUnitDenominationId = nil
106+
}
107+
108+
public init(accountId: Int, globalUnitDenominationId: Int) {
109+
self.accountId = accountId
110+
self.balanceTime = nil
111+
self.globalUnitDenominationId = globalUnitDenominationId
112+
customUnitDenominationId = nil
113+
return
114+
}
115+
116+
public init(
117+
accountId: Int,
118+
balanceTime: Date,
119+
globalUnitDenominationId: Int
120+
) {
121+
self.accountId = accountId
122+
self.balanceTime = balanceTime
123+
self.globalUnitDenominationId = globalUnitDenominationId
124+
customUnitDenominationId = nil
125+
return
126+
}
127+
128+
public func encode(to encoder: Encoder) throws {
129+
var container = encoder.container(keyedBy: CodingKeys.self)
130+
try container.encode(accountId, forKey: .accountId)
131+
try container.encode(
132+
customUnitDenominationId,
133+
forKey: .customUnitDenominationId
134+
)
135+
try container.encode(
136+
globalUnitDenominationId,
137+
forKey: .globalUnitDenominationId
138+
)
139+
try container.encode(balanceTime, forKey: .balanceTime)
140+
return
141+
}
142+
143+
enum CodingKeys: String, CodingKey {
144+
case accountId = "account_id"
145+
case customUnitDenominationId = "custom_unit_denomination"
146+
case globalUnitDenominationId = "global_unit_denomination"
147+
case balanceTime = "balance_time"
148+
}
149+
150+
}

0 commit comments

Comments
 (0)