From c42108d3dffd71a43fe6f6f0b0b2d22382f49cf9 Mon Sep 17 00:00:00 2001 From: Saehej Kang Date: Wed, 21 Jan 2026 22:00:03 -0800 Subject: [PATCH] [image-inspect]: stdout/stderr and logging refactor (#1044) - Relates to #642. - Each image carries it own error message (allows for different error types per image) - Stdout/stderr support - Use of the new `StderrLogHandler` --- .../Image/ImageInspect.swift | 34 +++++++++++++++---- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/Sources/ContainerCommands/Image/ImageInspect.swift b/Sources/ContainerCommands/Image/ImageInspect.swift index 58d9b5b3..535940d4 100644 --- a/Sources/ContainerCommands/Image/ImageInspect.swift +++ b/Sources/ContainerCommands/Image/ImageInspect.swift @@ -16,8 +16,10 @@ import ArgumentParser import ContainerAPIClient +import ContainerLog import ContainerizationError import Foundation +import Logging import SwiftProtobuf extension Application { @@ -34,21 +36,39 @@ extension Application { public init() {} + struct InspectError: Error { + let succeeded: [String] + let failed: [(String, Error)] + } + public func run() async throws { var printable = [any Codable]() + var succeededImages: [String] = [] + var allErrors: [(String, Error)] = [] + let result = try await ClientImage.get(names: images) - let notFound = result.error + for image in result.images { - guard !Utility.isInfraImage(name: image.reference) else { - continue - } + guard !Utility.isInfraImage(name: image.reference) else { continue } printable.append(try await image.details()) + succeededImages.append(image.reference) } - if printable.count > 0 { + + for missing in result.error { + allErrors.append((missing, ContainerizationError(.notFound, message: "Image not found"))) + } + + if !printable.isEmpty { print(try printable.jsonArray()) } - if notFound.count > 0 { - throw ContainerizationError(.notFound, message: "images: \(notFound.joined(separator: "\n"))") + + if !allErrors.isEmpty { + let logger = Logger(label: "ImageInspect", factory: { _ in StderrLogHandler() }) + for (name, error) in allErrors { + logger.error("\(name): \(error.localizedDescription)") + } + + throw InspectError(succeeded: succeededImages, failed: allErrors) } } }