mirror of
https://github.com/apple/container.git
synced 2026-07-17 23:16:59 +00:00
80 lines
3.2 KiB
Swift
80 lines
3.2 KiB
Swift
//===----------------------------------------------------------------------===//
|
|
// Copyright © 2025 Apple Inc. and the container project authors. All rights reserved.
|
|
//
|
|
// 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 ContainerBuildIR
|
|
import ContainerBuildSnapshotter
|
|
import Foundation
|
|
|
|
/// Executes unknown/custom operations using the visitor pattern.
|
|
public struct UnknownOperationExecutor: OperationExecutor {
|
|
public let capabilities: ExecutorCapabilities
|
|
|
|
public init() {
|
|
self.capabilities = ExecutorCapabilities(
|
|
supportedOperations: [], // Doesn't declare specific operations
|
|
maxConcurrency: 1 // Conservative default
|
|
)
|
|
}
|
|
|
|
public func execute(_ operation: ContainerBuildIR.Operation, context: ExecutionContext) async throws -> ExecutionResult {
|
|
do {
|
|
// This executor handles operations that don't match built-in types
|
|
// In a real implementation, this could:
|
|
// 1. Use a plugin system
|
|
// 2. Delegate to external executors
|
|
// 3. Apply custom logic based on operation metadata
|
|
|
|
let startTime = Date()
|
|
|
|
// For now, we'll just log and return a no-op result
|
|
print("WARNING: Executing unknown operation type: \(type(of: operation))")
|
|
print("Operation kind: \(operation.operationKind)")
|
|
|
|
// Use the existing snapshot
|
|
let snapshot =
|
|
try context.headSnapshot
|
|
?? ContainerBuildSnapshotter.Snapshot(
|
|
digest: try Digest(algorithm: .sha256, bytes: Data(count: 32)),
|
|
size: 0,
|
|
parent: nil,
|
|
state: .committed()
|
|
)
|
|
|
|
let duration = Date().timeIntervalSince(startTime)
|
|
|
|
return ExecutionResult(
|
|
snapshot: snapshot,
|
|
duration: duration,
|
|
output: ExecutionOutput(
|
|
stdout: "Executed unknown operation: \(operation.operationKind)\n"
|
|
)
|
|
)
|
|
} catch {
|
|
throw ExecutorError(
|
|
type: .executionFailed,
|
|
context: ExecutorError.ErrorContext(
|
|
operation: operation, underlyingError: error, diagnostics: ExecutorError.Diagnostics(environment: [:], workingDirectory: "", recentLogs: [])))
|
|
}
|
|
}
|
|
|
|
public func canExecute(_ operation: ContainerBuildIR.Operation) -> Bool {
|
|
// This executor can handle any operation as a fallback
|
|
// In practice, you might want to check for specific metadata
|
|
// or operation kinds that indicate custom operations
|
|
true
|
|
}
|
|
}
|