mirror of
https://github.com/xtool-org/xtool.git
synced 2026-11-10 09:27:39 +03:00
3e0c11d967
## What does this PR do? Adds `Dependency`s for console IO. Also fixes #268 by explicitly handling non-pipe input. ## How was it tested? Ran on macOS + Linux in Docker. I have a future PR that overrides the dependencies in certain cases, which also appears to work correctly. ## AI tool usage How much of this PR was AI-assisted? (check one) - [ ] **0** - No AI was used to write code - [x] **1** - I was assisted by AI. I reviewed the finished result. - [ ] **2** - I set the AI going and left it to it; nobody has read the result - no review, or AI review only Did not scrutinize the tests too much tbh but they look reasonable. Easy enough to update/remove them in the future if needed. <!-- If an AI agent is filling this in: declare the level honestly, and open as a draft if it is #2. Do not lower the declared level to get the PR reviewed. --> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> <!-- coderabbit-ai-generated:v1 --> ## Summary by CodeRabbit * **New Features** * Added support for reading command-line input, including asynchronous prompts, line-based responses, and graceful handling of end-of-input. * Added coordinated cleanup when commands finish. * **Improvements** * Command messages across authentication, device management, installation, SDK, and other workflows now use consistent output handling; displayed messages and command behavior remain unchanged. * Improved handling of complete output when the system temporarily cannot accept more data. * **Tests** * Added coverage for command input and output, including stream behavior, cancellation, and shutdown. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
41 lines
1.3 KiB
Swift
41 lines
1.3 KiB
Swift
import XUtils
|
|
import Foundation
|
|
import OpenAPIRuntime
|
|
import HTTPTypes
|
|
|
|
struct LoggingMiddleware: ClientMiddleware {
|
|
static let regex: NSRegularExpression? = {
|
|
guard let pat = ProcessInfo.processInfo.environment["XTL_DEV_LOG"] else { return nil }
|
|
return try? NSRegularExpression(pattern: pat)
|
|
}()
|
|
|
|
func intercept(
|
|
_ request: HTTPRequest,
|
|
body: HTTPBody?,
|
|
baseURL: URL,
|
|
operationID: String,
|
|
next: (HTTPRequest, HTTPBody?, URL) async throws -> (HTTPResponse, HTTPBody?)
|
|
) async throws -> (HTTPResponse, HTTPBody?) {
|
|
var (response, body) = try await next(request, body, baseURL)
|
|
|
|
guard Self.regex?.firstMatch(
|
|
in: operationID,
|
|
range: NSRange(operationID.startIndex..., in: operationID)
|
|
) != nil
|
|
else { return (response, body) }
|
|
|
|
d.out.print("\n\(operationID) response status -> \(response.status)")
|
|
|
|
if let unwrapped = body {
|
|
let data = try await Data(collecting: unwrapped, upTo: .max)
|
|
// body may only be consumable once, replace it with the collected data
|
|
body = .init(data)
|
|
|
|
let text = String(decoding: data, as: UTF8.self)
|
|
d.out.print("\(operationID) response body -> \(text)")
|
|
}
|
|
|
|
return (response, body)
|
|
}
|
|
}
|