59 lines
1.7 KiB
Swift
59 lines
1.7 KiB
Swift
/*
|
|
Copyright 2019-2024 New Vector Ltd.
|
|
|
|
SPDX-License-Identifier: AGPL-3.0-only
|
|
Please see LICENSE in the repository root for full details.
|
|
*/
|
|
|
|
import Foundation
|
|
|
|
struct EmojiMartStore {
|
|
let categories: [EmojiMartCategory]
|
|
let emojis: [EmojiItem]
|
|
}
|
|
|
|
// MARK: - Decodable
|
|
extension EmojiMartStore: Decodable {
|
|
|
|
/// JSON keys associated to EmojiMartStore properties.
|
|
enum CodingKeys: String, CodingKey {
|
|
case categories
|
|
case emojis
|
|
}
|
|
|
|
/// JSON key associated to emoji short name.
|
|
struct EmojiKey: CodingKey {
|
|
var stringValue: String
|
|
|
|
init?(stringValue: String) {
|
|
self.stringValue = stringValue
|
|
}
|
|
|
|
var intValue: Int? { return nil }
|
|
init?(intValue: Int) { return nil }
|
|
}
|
|
|
|
public init(from decoder: Decoder) throws {
|
|
let container = try decoder.container(keyedBy: CodingKeys.self)
|
|
|
|
let emojisContainer = try container.nestedContainer(keyedBy: EmojiKey.self, forKey: .emojis)
|
|
|
|
let emojis: [EmojiItem] = emojisContainer.allKeys.compactMap { (emojiKey) -> EmojiItem? in
|
|
let emojiItem: EmojiItem?
|
|
|
|
do {
|
|
emojiItem = try emojisContainer.decode(EmojiItem.self, forKey: emojiKey)
|
|
} catch {
|
|
MXLog.debug("[EmojiJSONStore] init(from decoder: Decoder) failed to parse emojiItem \(emojiKey) with error: \(error)")
|
|
emojiItem = nil
|
|
}
|
|
|
|
return emojiItem
|
|
}
|
|
|
|
let categories = try container.decode([EmojiMartCategory].self, forKey: .categories)
|
|
|
|
self.init(categories: categories, emojis: emojis)
|
|
}
|
|
}
|