项目文件夹

文件
wehub-resource-sync 1d1286fadb
Build / Build and test (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:18:38 +08:00

75 行
1.9 KiB
Swift

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
import Foundation
enum PluginInvocationFailure: LocalizedError {
case swiftError(Error)
case objectiveCException(name: String, reason: String?)
case missingReturnValue
var errorDescription: String? {
switch self {
case let .swiftError(error):
return error.localizedDescription
case let .objectiveCException(name, reason):
if let reason, !reason.isEmpty {
return "\(name)\(reason)"
}
return name
case .missingReturnValue:
return AppL10n.plugins("plugin.error.invocation.missingReturnValue", defaultValue: "插件调用未返回结果。")
}
}
}
enum PluginInvocationGuard {
static func run(
operation: String,
_ body: () throws -> Void
) -> Result<Void, PluginInvocationFailure> {
var swiftError: Error?
let exception = MTPluginInvocationCatcher.catchException(in: {
do {
try body()
} catch {
swiftError = error
}
})
if let exception {
return .failure(
.objectiveCException(
name: exception.name.rawValue,
reason: exception.reason
)
)
}
if let swiftError {
return .failure(.swiftError(swiftError))
}
return .success(())
}
static func value<T>(
operation: String,
_ body: () throws -> T
) -> Result<T, PluginInvocationFailure> {
var value: T?
let result = run(operation: operation) {
value = try body()
}
switch result {
case .success:
guard let value else {
return .failure(.missingReturnValue)
}
return .success(value)
case let .failure(failure):
return .failure(failure)
}
}
}