-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Expand file tree
/
Copy pathShowMessageRequestHandler.swift
More file actions
55 lines (45 loc) · 1.88 KB
/
ShowMessageRequestHandler.swift
File metadata and controls
55 lines (45 loc) · 1.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import JSONRPC
import Foundation
import Combine
import Logger
import AppKit
import LanguageServerProtocol
public protocol ShowMessageRequestHandler {
func handleShowMessageRequest(
_ request: ShowMessageRequest,
callback: @escaping @Sendable (Result<MessageActionItem?, JSONRPCResponseError<JSONValue>>) async -> Void
)
}
public final class ShowMessageRequestHandlerImpl: ShowMessageRequestHandler {
public static let shared = ShowMessageRequestHandlerImpl()
public func handleShowMessageRequest(
_ request: ShowMessageRequest,
callback: @escaping @Sendable (Result<MessageActionItem?, JSONRPCResponseError<JSONValue>>) async -> Void
) {
guard let params = request.params else { return }
Logger.gitHubCopilot.debug("Received Show Message Request: \(params)")
Task { @MainActor in
let selectedAction = showMessageRequestAlert(params)
await callback(.success(selectedAction))
}
}
@MainActor
func showMessageRequestAlert(_ params: ShowMessageRequestParams) -> MessageActionItem? {
let alert = NSAlert()
alert.messageText = "GitHub Copilot"
alert.informativeText = params.message
alert.alertStyle = params.type == .info ? .informational : .warning
let actions = params.actions ?? []
for item in actions {
alert.addButton(withTitle: item.title)
}
let response = alert.runModal()
// Map the button response to the corresponding action
// .alertFirstButtonReturn = 1000, .alertSecondButtonReturn = 1001, etc.
let buttonIndex = response.rawValue - NSApplication.ModalResponse.alertFirstButtonReturn.rawValue
guard buttonIndex >= 0 && buttonIndex < actions.count else {
return nil
}
return actions[buttonIndex]
}
}