11import BuiltinExtension
22import CodeiumService
3- import struct CopilotForXcodeKit. WorkspaceInfo
43import enum CopilotForXcodeKit. SuggestionServiceError
4+ import struct CopilotForXcodeKit. WorkspaceInfo
55import Foundation
66import GitHubCopilotService
77import Preferences
@@ -17,18 +17,21 @@ import ProExtension
1717public protocol SuggestionServiceType : SuggestionServiceProvider { }
1818
1919public actor SuggestionService : SuggestionServiceType {
20+ typealias Middleware = SuggestionServiceMiddleware
21+ typealias EventHandler = SuggestionServiceEventHandler
2022 public var configuration : SuggestionProvider . SuggestionServiceConfiguration {
2123 get async { await suggestionProvider. configuration }
2224 }
2325
24- let middlewares : [ SuggestionServiceMiddleware ]
26+ let middlewares : [ Middleware ]
27+ let eventHandlers : [ EventHandler ]
2528
2629 let suggestionProvider : SuggestionServiceProvider
2730
2831 public init (
2932 provider: any SuggestionServiceProvider ,
30- middlewares: [ SuggestionServiceMiddleware ] = SuggestionServiceMiddlewareContainer
31- . middlewares
33+ middlewares: [ Middleware ] = SuggestionServiceMiddlewareContainer . middlewares ,
34+ eventHandlers : [ EventHandler ] = SuggestionServiceEventHandlerContainer . handlers
3235 ) {
3336 suggestionProvider = provider
3437 self . middlewares = middlewares
@@ -67,7 +70,7 @@ public extension SuggestionService {
6770 do {
6871 var getSuggestion = suggestionProvider. getSuggestions ( _: workspaceInfo: )
6972 let configuration = await configuration
70-
73+
7174 for middleware in middlewares. reversed ( ) {
7275 getSuggestion = { [ getSuggestion] request, workspaceInfo in
7376 try await middleware. getSuggestion (
@@ -79,7 +82,7 @@ public extension SuggestionService {
7982 )
8083 }
8184 }
82-
85+
8386 return try await getSuggestion ( request, workspaceInfo)
8487 } catch let error as SuggestionServiceError {
8588 throw error
@@ -92,13 +95,15 @@ public extension SuggestionService {
9295 _ suggestion: SuggestionBasic . CodeSuggestion ,
9396 workspaceInfo: CopilotForXcodeKit . WorkspaceInfo
9497 ) async {
98+ eventHandlers. forEach { $0. didAccept ( suggestion, workspaceInfo: workspaceInfo) }
9599 await suggestionProvider. notifyAccepted ( suggestion, workspaceInfo: workspaceInfo)
96100 }
97101
98102 func notifyRejected(
99103 _ suggestions: [ SuggestionBasic . CodeSuggestion ] ,
100104 workspaceInfo: CopilotForXcodeKit . WorkspaceInfo
101105 ) async {
106+ eventHandlers. forEach { $0. didReject ( suggestion, workspaceInfo: workspaceInfo) }
102107 await suggestionProvider. notifyRejected ( suggestions, workspaceInfo: workspaceInfo)
103108 }
104109
0 commit comments