containerization-framework 0.10.0

Rust bindings for Apple's Containerization framework: Linux containers in lightweight VMs, in-process and without a daemon.
//===----------------------------------------------------------------------===//
// The OCI runtime spec's Linux section, both ways: its namespaces, ID
// mappings, devices and personality. The Rust side is
// `bridge::accessors::spec::linux`.
//===----------------------------------------------------------------------===//

import ContainerizationOCI
import Foundation

// MARK: Rust to Swift

extension Linux {
  init(_ linux: RustLinuxRef) {
    self.init(
      uidMappings: list(linux.uidMappingsLen()) { LinuxIDMapping(linux.uidMappingsAt($0)) },
      gidMappings: list(linux.gidMappingsLen()) { LinuxIDMapping(linux.gidMappingsAt($0)) },
      sysctl: linux.hasSysctl() ? dictionary(linux.sysctlLen(), linux.sysctlKeyAt, linux.sysctlValueAt) : nil,
      resources: linux.hasResources() ? LinuxResources(linux.resources()) : nil,
      cgroupsPath: linux.cgroupsPath().toString(),
      namespaces: list(linux.namespacesLen()) {
        LinuxNamespace(type: swiftCase(linux.namespaceTypeAt($0)), path: linux.namespacePathAt($0).toString())
      },
      devices: list(linux.devicesLen()) { LinuxDevice(linux.devicesAt($0)) },
      seccomp: linux.hasSeccomp() ? LinuxSeccomp(linux.seccomp()) : nil,
      rootfsPropagation: linux.rootfsPropagation().toString(),
      maskedPaths: strings(linux.maskedPathsLen(), linux.maskedPathsAt),
      readonlyPaths: strings(linux.readonlyPathsLen(), linux.readonlyPathsAt),
      mountLabel: linux.mountLabel().toString(),
      personality: linux.hasPersonality()
        ? LinuxPersonality(
          domain: swiftCase(linux.personalityDomain()),
          flags: strings(linux.personalityFlagsLen(), linux.personalityFlagsAt)
        ) : nil
    )
  }
}

extension LinuxIDMapping {
  init(_ mapping: RustLinuxIDMappingRef) {
    self.init(containerID: mapping.containerID(), hostID: mapping.hostID(), size: mapping.size())
  }
}

extension LinuxDevice {
  init(_ device: RustLinuxDeviceRef) {
    self.init(
      path: device.path().toString(),
      type: device.deviceType().toString(),
      major: device.major(),
      minor: device.minor(),
      fileMode: device.fileMode(),
      uid: device.uid(),
      gid: device.gid()
    )
  }
}

// MARK: Swift to Rust

extension CzOutcome {
  // `Linux`.

  func linuxUidMappings() -> CzOutcome {
    CzOutcome.holding((taken() as Linux).uidMappings)
  }

  func linuxGidMappings() -> CzOutcome {
    CzOutcome.holding((taken() as Linux).gidMappings)
  }

  func linuxSysctl() -> CzOutcome {
    CzOutcome.holding((taken() as Linux).sysctl)
  }

  func linuxResources() -> CzOutcome {
    CzOutcome.holding((taken() as Linux).resources)
  }

  func linuxCgroupsPath() -> String {
    (taken() as Linux).cgroupsPath
  }

  func linuxNamespaces() -> CzOutcome {
    CzOutcome.holding((taken() as Linux).namespaces)
  }

  func linuxDevices() -> CzOutcome {
    CzOutcome.holding((taken() as Linux).devices)
  }

  func linuxSeccomp() -> CzOutcome {
    CzOutcome.holding((taken() as Linux).seccomp)
  }

  func linuxRootfsPropagation() -> String {
    (taken() as Linux).rootfsPropagation
  }

  func linuxMaskedPaths() -> RustVec<RustString> {
    rustStrings((taken() as Linux).maskedPaths)
  }

  func linuxReadonlyPaths() -> RustVec<RustString> {
    rustStrings((taken() as Linux).readonlyPaths)
  }

  func linuxMountLabel() -> String {
    (taken() as Linux).mountLabel
  }

  func linuxPersonality() -> CzOutcome {
    CzOutcome.holding((taken() as Linux).personality)
  }

  // `LinuxNamespace` and `LinuxIDMapping`.

  func namespaceType() -> String {
    (taken() as LinuxNamespace).type.rawValue
  }

  func namespacePath() -> String {
    (taken() as LinuxNamespace).path
  }

  func idMappingContainerID() -> UInt32 {
    (taken() as LinuxIDMapping).containerID
  }

  func idMappingHostID() -> UInt32 {
    (taken() as LinuxIDMapping).hostID
  }

  func idMappingSize() -> UInt32 {
    (taken() as LinuxIDMapping).size
  }

  // `LinuxDevice`.

  func devicePath() -> String {
    (taken() as LinuxDevice).path
  }

  func deviceType() -> String {
    (taken() as LinuxDevice).type
  }

  func deviceMajor() -> Int64 {
    (taken() as LinuxDevice).major
  }

  func deviceMinor() -> Int64 {
    (taken() as LinuxDevice).minor
  }

  func deviceFileMode() -> UInt32? {
    (taken() as LinuxDevice).fileMode
  }

  func deviceUid() -> UInt32? {
    (taken() as LinuxDevice).uid
  }

  func deviceGid() -> UInt32? {
    (taken() as LinuxDevice).gid
  }

  // `LinuxPersonality`.

  func personalityDomain() -> String {
    (taken() as LinuxPersonality).domain.rawValue
  }

  func personalityFlags() -> RustVec<RustString> {
    rustStrings((taken() as LinuxPersonality).flags)
  }
}