forked from intitni/CopilotForXcode
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCommandHandler.swift
More file actions
124 lines (95 loc) · 3.82 KB
/
CommandHandler.swift
File metadata and controls
124 lines (95 loc) · 3.82 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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import Dependencies
import Foundation
import Preferences
import SuggestionBasic
import Toast
import XcodeInspector
/// Provides an interface to handle commands.
public protocol CommandHandler {
// MARK: Suggestion
func presentSuggestions(_ suggestions: [CodeSuggestion]) async
func presentPreviousSuggestion() async
func presentNextSuggestion() async
func rejectSuggestions() async
func acceptSuggestion() async
func dismissSuggestion() async
func generateRealtimeSuggestions(sourceEditor: SourceEditor?) async
// MARK: Chat
func openChat(forceDetach: Bool, activateThisApp: Bool)
func sendChatMessage(_ message: String) async
// MARK: Prompt to Code
func acceptPromptToCode() async
// MARK: Custom Command
func handleCustomCommand(_ command: CustomCommand) async
// MARK: Toast
func toast(_ string: String, as type: ToastType)
}
public struct CommandHandlerDependencyKey: DependencyKey {
public static var liveValue: CommandHandler = UniversalCommandHandler.shared
public static var testValue: CommandHandler = NoopCommandHandler()
}
public extension DependencyValues {
/// In production, you need to override the command handler globally by setting
/// ``UniversalCommandHandler.shared.commandHandler``.
///
/// In tests, you can use ``withDependency`` to mock it.
var commandHandler: CommandHandler {
get { self[CommandHandlerDependencyKey.self] }
set { self[CommandHandlerDependencyKey.self] = newValue }
}
}
public final class UniversalCommandHandler: CommandHandler {
public static let shared: UniversalCommandHandler = UniversalCommandHandler()
public var commandHandler: CommandHandler = NoopCommandHandler()
private init() {}
public func presentSuggestions(_ suggestions: [SuggestionBasic.CodeSuggestion]) async {
await commandHandler.presentSuggestions(suggestions)
}
public func presentPreviousSuggestion() async {
await commandHandler.presentPreviousSuggestion()
}
public func presentNextSuggestion() async {
await commandHandler.presentNextSuggestion()
}
public func rejectSuggestions() async {
await commandHandler.rejectSuggestions()
}
public func acceptSuggestion() async {
await commandHandler.acceptSuggestion()
}
public func dismissSuggestion() async {
await commandHandler.dismissSuggestion()
}
public func generateRealtimeSuggestions(sourceEditor: SourceEditor?) async {
await commandHandler.generateRealtimeSuggestions(sourceEditor: sourceEditor)
}
public func openChat(forceDetach: Bool, activateThisApp: Bool) {
commandHandler.openChat(forceDetach: forceDetach, activateThisApp: activateThisApp)
}
public func sendChatMessage(_ message: String) async {
await commandHandler.sendChatMessage(message)
}
public func acceptPromptToCode() async {
await commandHandler.acceptPromptToCode()
}
public func handleCustomCommand(_ command: CustomCommand) async {
await commandHandler.handleCustomCommand(command)
}
public func toast(_ string: String, as type: ToastType) {
commandHandler.toast(string, as: type)
}
}
struct NoopCommandHandler: CommandHandler {
func presentSuggestions(_: [CodeSuggestion]) async {}
func presentPreviousSuggestion() async {}
func presentNextSuggestion() async {}
func rejectSuggestions() async {}
func acceptSuggestion() async {}
func dismissSuggestion() async {}
func generateRealtimeSuggestions(sourceEditor: SourceEditor?) async {}
func openChat(forceDetach: Bool, activateThisApp: Bool) {}
func sendChatMessage(_: String) async {}
func acceptPromptToCode() async {}
func handleCustomCommand(_: CustomCommand) async {}
func toast(_: String, as: ToastType) {}
}