containerization-framework 0.4.0

Rust bindings for Apple's Containerization framework: Linux containers in lightweight VMs, in-process and without a daemon.
//===----------------------------------------------------------------------===//
// `ContentWriter`, from ContainerizationOCI.
//===----------------------------------------------------------------------===//

import ContainerizationOCI
import Foundation

func openContentWriter(base: RustStr) -> CzOutcome {
  let base = URL(filePath: base.toString())

  return CzOutcome { CzContentWriter(try ContentWriter(for: base)) }
}

/// Unchecked: Rust's `ContentWriter` isn't `Sync`, so one call runs at a time.
final class CzContentWriter: @unchecked Sendable {
  let writer: ContentWriter

  init(_ writer: ContentWriter) {
    self.writer = writer
  }

  // Each outcome holds the size and the digest, as its `digestString`.

  func write(data: RustVec<UInt8>) -> CzOutcome {
    let data = Data(data)

    return CzOutcome {
      let (size, digest) = try writer.write(data)
      return Written(size: size, digest: digest.digestString)
    }
  }

  func create(from: RustStr) -> CzOutcome {
    let url = URL(filePath: from.toString())

    return CzOutcome {
      let (size, digest) = try writer.create(from: url)
      return Written(size: size, digest: digest.digestString)
    }
  }
}

func copyContent(from: RustStr, destination: RustStr) -> CzOutcome {
  let url = URL(filePath: from.toString())
  let destination = URL(filePath: destination.toString())

  return CzOutcome {
    let (size, digest) = try ContentWriter.copy(from: url, destination: destination)
    return Written(size: size, digest: digest.digestString)
  }
}

/// What a `ContentWriter` wrote.
struct Written {
  let size: Int64
  let digest: String
}