spiegel-keyman/ios/engine/KMEI/KeymanEngine/Classes/Model/LexicalModel.swift

162 lines
5.7 KiB
Swift

//
// LexicalModel.swift
// KeymanEngine
//
// Created by Randy Boring on 3/14/19.
// Copyright © 2019 SIL International. All rights reserved.
//
import Foundation
/// LexicalModel object for Keyman Cloud API 4.0
public struct LexicalModel: Codable {
/// ID of the lexical model. Always matches the filename of the lexical model
public var id: String
/// Name of the lexical model
public var name: String
/// license under which the author released the lexical model (optional)?
public var license: String?
/// Dot-decimal version number of the lexical model. (optional)?
public var version: String?
/// bcp47 tags of languages supported by this lexical model
public var languages: [String]
/// name of the author (optional)
public var authorName: String?
/// Size in bytes of the lexical model .js file. (optional)
public var fileSize: Int?
/// full URL of the .js file of the lexical model
public var filename: String
/// relative path of the lexical model, e.g., "release/example/en.custom"
public var sourcePath: String?
/// email address of the author (optional)
public var authorEmail: String?
/// description of the lexical model (optional)
public var description: String?
/// Size in bytes of the lexical model KMP file
public var packageFileSize: Int?
/// Full URL of the lexical model KMP file. [Note: yes, this capitalization is correct.]
public var packageFilename: String
/// Array of Full URLs of the other files included by reference in the lexical model
public var packageIncludes: [String]?
/// Whether the lexical model is the recommended default for the language
public var isDefault: Bool?
/// Date the lexical model was last updated
public var lastModifiedDate: Date?
/// Dot-decimal version number of the earliest Keyman version that supports this lexical model. (optional)
public var minKeymanVersion: String?
enum CodingKeys: String, CodingKey {
case id
case name
case license
case version
case languages
case authorName
case fileSize = "jsFileSize"
case filename = "jsFilename"
case sourcePath
case authorEmail
case description
case packageFileSize
case packageFilename
case packageIncludes
case isDefault = "default"
case lastModifiedDate
case minKeymanVersion
}
public init(id: String,
name: String,
license: String?,
version: String?,
languages: [String],
authorName: String?,
fileSize: Int?,
filename: String,
sourcePath: String?,
authorEmail: String?,
description: String?,
packageFileSize: Int?,
packageFilename: String,
packageIncludes: [String]?,
isDefault: Bool?,
lastModified: Date?,
minKeymanVersion: String?) {
self.id = id
self.name = name
self.license = license
self.version = version
self.languages = languages
self.authorName = authorName
self.fileSize = fileSize
self.filename = filename
self.sourcePath = sourcePath
self.authorEmail = authorEmail
self.description = description
self.packageFileSize = packageFileSize
self.packageFilename = packageFilename
self.packageIncludes = packageIncludes
self.isDefault = isDefault ?? false
self.lastModifiedDate = lastModified
self.minKeymanVersion = minKeymanVersion
}
public init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
let id = try container.decode(String.self, forKey: .id)
let name = try container.decode(String.self, forKey: .name)
let license = try container.decodeIfPresent(String.self, forKey: .license)
let version = try container.decodeIfPresent(String.self, forKey: .version)
let languages = try container.decode([String].self, forKey: .languages)
let authorName = try container.decodeIfPresent(String.self, forKey: .authorName)
let fileSize = try container.decodeIfPresent(Int.self, forKey: .fileSize)
let filename = try container.decode(String.self, forKey: .filename)
let sourcePath = try container.decodeIfPresent(String.self, forKey: .sourcePath)
let authorEmail = try container.decodeIfPresent(String.self, forKey: .authorEmail)
let description = try container.decodeIfPresent(String.self, forKey: .description)
let packageFileSize = try container.decodeIfPresent(Int.self, forKey: .packageFileSize)
let packageFilename = try container.decode(String.self, forKey: .packageFilename)
let packageIncludes = try container.decodeIfPresent([String].self, forKey: .packageIncludes)
let isDefault = try container.decodeIfPresent(Bool.self, forKey: .isDefault)
// TODO: Handle both seconds and ISO 8601
let lastModifiedStr = try container.decode(String.self, forKey: .lastModifiedDate)
let lastModified : Date? = Formatter.iso8601.date(from: lastModifiedStr) ?? Formatter.iso8601noFS.date(from: lastModifiedStr)
let minKeymanVersion = try container.decodeIfPresent(String.self, forKey: .minKeymanVersion)
self.init(id: id,
name: name,
license: license,
version: version,
languages: languages,
authorName: authorName,
fileSize: fileSize,
filename: filename,
sourcePath: sourcePath,
authorEmail: authorEmail,
description: description,
packageFileSize: packageFileSize,
packageFilename: packageFilename,
packageIncludes: packageIncludes,
isDefault: isDefault,
lastModified: lastModified,
minKeymanVersion: minKeymanVersion)
}
}