From b7cac2420ad83fca9ed144c499dcd726e7a35769 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Tue, 10 Mar 2026 23:16:14 +0700 Subject: [PATCH] feat: add shared PluginKit types (error protocol, row limits, async utility) --- .../PluginConcurrencySupport.swift | 33 +++++++++++++++++++ .../TableProPluginKit/PluginDriverError.swift | 19 +++++++++++ .../TableProPluginKit/PluginRowLimits.swift | 5 +++ 3 files changed, 57 insertions(+) create mode 100644 Plugins/TableProPluginKit/PluginConcurrencySupport.swift create mode 100644 Plugins/TableProPluginKit/PluginDriverError.swift create mode 100644 Plugins/TableProPluginKit/PluginRowLimits.swift diff --git a/Plugins/TableProPluginKit/PluginConcurrencySupport.swift b/Plugins/TableProPluginKit/PluginConcurrencySupport.swift new file mode 100644 index 000000000..1e6f74104 --- /dev/null +++ b/Plugins/TableProPluginKit/PluginConcurrencySupport.swift @@ -0,0 +1,33 @@ +import Foundation + +public func pluginDispatchAsync( + on queue: DispatchQueue, + execute work: @escaping @Sendable () throws -> T +) async throws -> T { + try await withCheckedThrowingContinuation { continuation in + queue.async { + do { + let result = try work() + continuation.resume(returning: result) + } catch { + continuation.resume(throwing: error) + } + } + } +} + +public func pluginDispatchAsync( + on queue: DispatchQueue, + execute work: @escaping @Sendable () throws -> Void +) async throws { + try await withCheckedThrowingContinuation { (continuation: CheckedContinuation) in + queue.async { + do { + try work() + continuation.resume() + } catch { + continuation.resume(throwing: error) + } + } + } +} diff --git a/Plugins/TableProPluginKit/PluginDriverError.swift b/Plugins/TableProPluginKit/PluginDriverError.swift new file mode 100644 index 000000000..01a2a99b9 --- /dev/null +++ b/Plugins/TableProPluginKit/PluginDriverError.swift @@ -0,0 +1,19 @@ +// +// PluginDriverError.swift +// TableProPluginKit +// + +import Foundation + +public protocol PluginDriverError: LocalizedError, Sendable { + var pluginErrorMessage: String { get } + var pluginErrorCode: Int? { get } + var pluginSqlState: String? { get } + var pluginErrorDetail: String? { get } +} + +public extension PluginDriverError { + var pluginErrorCode: Int? { nil } + var pluginSqlState: String? { nil } + var pluginErrorDetail: String? { nil } +} diff --git a/Plugins/TableProPluginKit/PluginRowLimits.swift b/Plugins/TableProPluginKit/PluginRowLimits.swift new file mode 100644 index 000000000..079759160 --- /dev/null +++ b/Plugins/TableProPluginKit/PluginRowLimits.swift @@ -0,0 +1,5 @@ +import Foundation + +public enum PluginRowLimits { + public static let defaultMax = 100_000 +}