Skip to content

Commit a5e0935

Browse files
committed
Hook up the service
1 parent cf3a879 commit a5e0935

File tree

10 files changed

+117
-410
lines changed

10 files changed

+117
-410
lines changed

Core/Package.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ let package = Package(
161161
.product(name: "SuggestionModel", package: "Tool"),
162162
.product(name: "Environment", package: "Tool"),
163163
.product(name: "OpenAIService", package: "Tool"),
164+
.product(name: "ComposableArchitecture", package: "swift-composable-architecture"),
164165
]
165166
),
166167
.testTarget(name: "PromptToCodeServiceTests", dependencies: ["PromptToCodeService"]),
@@ -227,6 +228,7 @@ let package = Package(
227228
.target(
228229
name: "SuggestionWidget",
229230
dependencies: [
231+
"PromptToCodeService",
230232
"ChatGPTChatTab",
231233
.product(name: "UserDefaultsObserver", package: "Tool"),
232234
.product(name: "SharedUIComponents", package: "Tool"),

Core/Sources/PromptToCodeService/OpenAIPromptToCodeAPI.swift renamed to Core/Sources/PromptToCodeService/OpenAIPromptToCodeService.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,16 @@ import OpenAIService
33
import Preferences
44
import SuggestionModel
55

6-
final class OpenAIPromptToCodeAPI: PromptToCodeAPI {
6+
public final class OpenAIPromptToCodeService: PromptToCodeServiceType {
77
var service: (any ChatGPTServiceType)?
8+
9+
public init() {}
810

9-
func stopResponding() {
10-
Task {
11-
await service?.stopReceivingMessage()
12-
}
11+
public func stopResponding() {
12+
Task { await service?.stopReceivingMessage() }
1313
}
1414

15-
func modifyCode(
15+
public func modifyCode(
1616
code: String,
1717
language: CodeLanguage,
1818
indentSize: Int,
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import Foundation
2+
import SuggestionModel
3+
4+
public final class PreviewPromptToCodeService: PromptToCodeServiceType {
5+
public init() {}
6+
7+
public func modifyCode(
8+
code: String,
9+
language: CodeLanguage,
10+
indentSize: Int,
11+
usesTabsForIndentation: Bool,
12+
requirement: String,
13+
projectRootURL: URL,
14+
fileURL: URL,
15+
allCode: String,
16+
extraSystemPrompt: String?,
17+
generateDescriptionRequirement: Bool?
18+
) async throws -> AsyncThrowingStream<(code: String, description: String), Error> {
19+
return AsyncThrowingStream { continuation in
20+
Task {
21+
let code = """
22+
struct Cat {
23+
var name: String
24+
}
25+
26+
print("Hello world!")
27+
"""
28+
let description = "I have created a struct `Cat`."
29+
var resultCode = ""
30+
var resultDescription = ""
31+
do {
32+
for character in code {
33+
try await Task.sleep(nanoseconds: 50_000_000)
34+
resultCode.append(character)
35+
continuation.yield((resultCode, resultDescription))
36+
}
37+
for character in description {
38+
try await Task.sleep(nanoseconds: 50_000_000)
39+
resultDescription.append(character)
40+
continuation.yield((resultCode, resultDescription))
41+
}
42+
continuation.finish()
43+
} catch {
44+
continuation.finish(throwing: error)
45+
}
46+
}
47+
}
48+
}
49+
50+
public func stopResponding() {}
51+
}
52+

Core/Sources/PromptToCodeService/PromptToCodeService.swift

Lines changed: 0 additions & 158 deletions
This file was deleted.
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import Dependencies
2+
import Foundation
3+
import SuggestionModel
4+
5+
public protocol PromptToCodeServiceType {
6+
func modifyCode(
7+
code: String,
8+
language: CodeLanguage,
9+
indentSize: Int,
10+
usesTabsForIndentation: Bool,
11+
requirement: String,
12+
projectRootURL: URL,
13+
fileURL: URL,
14+
allCode: String,
15+
extraSystemPrompt: String?,
16+
generateDescriptionRequirement: Bool?
17+
) async throws -> AsyncThrowingStream<(code: String, description: String), Error>
18+
19+
func stopResponding()
20+
}
21+
22+
public struct PromptToCodeServiceDependencyKey: DependencyKey {
23+
public static let liveValue: PromptToCodeServiceType = PreviewPromptToCodeService()
24+
public static let previewValue: PromptToCodeServiceType = PreviewPromptToCodeService()
25+
}
26+
27+
public struct PromptToCodeServiceFactoryDependencyKey: DependencyKey {
28+
public static let liveValue: () -> PromptToCodeServiceType = { OpenAIPromptToCodeService() }
29+
public static let previewValue: () -> PromptToCodeServiceType = { PreviewPromptToCodeService() }
30+
}
31+
32+
public extension DependencyValues {
33+
var promptToCodeService: PromptToCodeServiceType {
34+
get { self[PromptToCodeServiceDependencyKey.self] }
35+
set { self[PromptToCodeServiceDependencyKey.self] = newValue }
36+
}
37+
38+
var promptToCodeServiceFactory: () -> PromptToCodeServiceType {
39+
get { self[PromptToCodeServiceFactoryDependencyKey.self] }
40+
set { self[PromptToCodeServiceFactoryDependencyKey.self] = newValue }
41+
}
42+
}
43+

Core/Sources/Service/GUI/ChatTabFactory.swift

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,20 +83,25 @@ enum ChatTabFactory {
8383
prompt: prompt
8484
)
8585
case let .promptToCode(extraSystemPrompt, instruction, _, _):
86-
let service = PromptToCodeService(
86+
let service = OpenAIPromptToCodeService()
87+
88+
let result = try await service.modifyCode(
8789
code: prompt,
88-
selectionRange: .outOfScope,
8990
language: .plaintext,
90-
identSize: 4,
91+
indentSize: 4,
9192
usesTabsForIndentation: true,
93+
requirement: instruction ?? "Modify content.",
9294
projectRootURL: .init(fileURLWithPath: "/"),
9395
fileURL: .init(fileURLWithPath: "/"),
9496
allCode: prompt,
9597
extraSystemPrompt: extraSystemPrompt,
9698
generateDescriptionRequirement: false
9799
)
98-
try await service.modifyCode(prompt: instruction ?? "Modify content.")
99-
return service.code
100+
var code = ""
101+
for try await (newCode, _) in result {
102+
code = newCode
103+
}
104+
return code
100105
}
101106
}
102107
)

0 commit comments

Comments
 (0)