forked from insidegui/WWDC
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSessionInstancesJSONAdapter.swift
More file actions
92 lines (72 loc) · 3 KB
/
SessionInstancesJSONAdapter.swift
File metadata and controls
92 lines (72 loc) · 3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
//
// SessionInstancesJSONAdapter.swift
// WWDC
//
// Created by Guilherme Rambo on 16/02/17.
// Copyright © 2017 Guilherme Rambo. All rights reserved.
//
import Foundation
import SwiftyJSON
enum SessionInstanceKeys: String, JSONSubscriptType {
case id, keywords, startTime, endTime, type
case favId = "fav_id"
case room = "roomId"
case track = "trackId"
var jsonKey: JSONKey {
return JSONKey.key(rawValue)
}
}
final class SessionInstancesJSONAdapter: Adapter {
typealias InputType = JSON
typealias OutputType = SessionInstance
func adapt(_ input: JSON) -> Result<SessionInstance, AdapterError> {
guard case .success(let session) = SessionsJSONAdapter().adapt(input) else {
return .error(.invalidData)
}
// not an instance
guard session.year == Calendar.current.component(.year, from: Date()) else {
return .error(.invalidData)
}
guard let startGMT = input[SessionInstanceKeys.startTime].string else {
return .error(.missingKey(SessionInstanceKeys.startTime))
}
guard let endGMT = input[SessionInstanceKeys.endTime].string else {
return .error(.missingKey(SessionInstanceKeys.startTime))
}
guard let rawType = input[SessionInstanceKeys.type].string else {
return .error(.missingKey(SessionInstanceKeys.type))
}
guard let id = input[SessionInstanceKeys.id].string else {
return .error(.missingKey(SessionInstanceKeys.id))
}
guard let roomIdentifier = input[SessionInstanceKeys.room].int else {
return .error(.missingKey(SessionInstanceKeys.room))
}
guard let trackIdentifier = input[SessionInstanceKeys.track].int else {
return .error(.missingKey(SessionInstanceKeys.track))
}
guard case .success(let startDate) = DateTimeAdapter().adapt(startGMT) else {
return .error(.invalidData)
}
guard case .success(let endDate) = DateTimeAdapter().adapt(endGMT) else {
return .error(.invalidData)
}
let instance = SessionInstance()
if let keywordsJson = input[SessionInstanceKeys.keywords].array {
if case .success(let keywords) = KeywordsJSONAdapter().adapt(keywordsJson) {
instance.keywords.append(objectsIn: keywords)
}
}
instance.identifier = session.identifier
instance.eventIdentifier = Event.identifier(from: startDate)
instance.number = id
instance.session = session
instance.trackIdentifier = "\(trackIdentifier)"
instance.roomIdentifier = "\(roomIdentifier)"
instance.rawSessionType = rawType
instance.sessionType = SessionInstanceType(rawSessionType: rawType)?.rawValue ?? 0
instance.startTime = startDate
instance.endTime = endDate
return .success(instance)
}
}