mirror of
https://github.com/apple/container.git
synced 2026-07-12 20:47:04 +00:00
6a3266fbe7
- Closes #1437. - Allows use by third-party extensions.
77 lines
3.0 KiB
Swift
77 lines
3.0 KiB
Swift
//===----------------------------------------------------------------------===//
|
|
// Copyright © 2026 Apple Inc. and the container project authors.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// https://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
import ContainerAPIClient
|
|
import Foundation
|
|
import TerminalProgress
|
|
|
|
extension Flags.Progress {
|
|
/// Resolves `.auto` into `.ansi` or `.plain` based on whether stderr is a TTY.
|
|
private func resolvedProgress() -> ProgressType {
|
|
switch progress {
|
|
case .auto:
|
|
return isatty(FileHandle.standardError.fileDescriptor) == 1 ? .ansi : .plain
|
|
case .none, .ansi, .plain, .color:
|
|
return progress
|
|
}
|
|
}
|
|
|
|
/// Creates a `ProgressConfig` based on the selected progress type.
|
|
///
|
|
/// For `.none`, progress updates are disabled. For `.ansi`, the given parameters
|
|
/// are used as-is. For `.plain`, ANSI-incompatible features (spinner, clear on finish)
|
|
/// are disabled and the output mode is set to `.plain`. For `.color`, behavior matches
|
|
/// `.ansi` but the output mode is set to `.color` to enable color-coded output.
|
|
/// For `.auto`, the type is resolved by checking whether stderr is a TTY.
|
|
public func makeConfig(
|
|
description: String = "",
|
|
itemsName: String = "it",
|
|
showTasks: Bool = false,
|
|
showItems: Bool = false,
|
|
showSpeed: Bool = true,
|
|
ignoreSmallSize: Bool = false,
|
|
totalTasks: Int? = nil
|
|
) throws -> ProgressConfig {
|
|
let resolved = resolvedProgress()
|
|
switch resolved {
|
|
case .none:
|
|
return try ProgressConfig(disableProgressUpdates: true)
|
|
case .ansi, .plain, .color:
|
|
let isPlain = resolved == .plain
|
|
let outputMode: ProgressConfig.OutputMode
|
|
switch resolved {
|
|
case .plain: outputMode = .plain
|
|
case .color: outputMode = .color
|
|
default: outputMode = .ansi
|
|
}
|
|
return try ProgressConfig(
|
|
description: description,
|
|
itemsName: itemsName,
|
|
showSpinner: !isPlain,
|
|
showTasks: showTasks,
|
|
showItems: showItems,
|
|
showSpeed: showSpeed,
|
|
ignoreSmallSize: ignoreSmallSize,
|
|
totalTasks: totalTasks,
|
|
clearOnFinish: !isPlain,
|
|
outputMode: outputMode
|
|
)
|
|
case .auto:
|
|
fatalError("unreachable: .auto should have been resolved")
|
|
}
|
|
}
|
|
}
|