vChewing-macOS/Packages/vChewing_Shared/Sources/Shared/CandidateNode_ServiceImpl.s...

48 lines
1.6 KiB
Swift

// (c) 2021 and onwards The vChewing Project (MIT-NTL License).
// ====================
// This code is released under the MIT license (SPDX-License-Identifier: MIT)
// ... with NTL restriction stating that:
// No trademark license is granted to use the trade names, trademarks, service
// marks, or product names of Contributor, except as required to fulfill notice
// requirements defined in MIT License.
public extension CandidateNode {
convenience init(
name: String, services: [CandidateTextService], previous: CandidateNode? = nil
) {
self.init(name: name, members: services.map(\.asCandidateNode), previous: previous)
}
var asServiceMenuNode: ServiceMenuNode? {
self as? ServiceMenuNode
}
var containsCandidateServices: Bool {
!members.compactMap(\.asServiceMenuNode).isEmpty
}
class ServiceMenuNode: CandidateNode {
public var service: CandidateTextService
public init(
name: String, service givenService: CandidateTextService, previous: CandidateNode? = nil
) {
service = givenService
super.init(name: name, previous: previous)
}
}
}
public extension CandidateTextService {
var asCandidateNode: CandidateNode.ServiceMenuNode {
.init(name: menuTitle, service: self)
}
static func getCurrentServiceMenu(
fromMap map: [String]? = nil, candidate: String, reading: [String]
) -> CandidateNode? {
let fetchedRaw = map ?? PrefMgr().candidateServiceMenuContents
let fetched = fetchedRaw.parseIntoCandidateTextServiceStack(candidate: candidate, reading: reading)
return fetched.isEmpty ? nil : .init(name: candidate, services: fetched)
}
}