mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-06 00:45:32 +00:00
162 lines
5.7 KiB
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)
|
|
}
|
|
}
|
|
|