native-ipc 0.6.2

One safe API for least-authority native shared memory: sealed memfd on Linux, Mach memory entries on macOS, exact-rights sections on Windows
//! Cross-target compilation fixture for the complete consumer type surface.

use native_ipc::active::{AccessError, ActiveReader, ActiveWriter, PrefaultResult};
use native_ipc::batch::{
    ActiveRegionSet, BatchError, ExpectedBatch, ExpectedRegion, TransferBatch,
};
use native_ipc::binding::{BindRejected, BoundReadMapping, BoundWriteMapping};
use native_ipc::control::{APPLICATION_CONTROL_KIND_MIN, ControlError, ControlFrame};
use native_ipc::core::layout::{RegionSetLayout, ValidatedRegionLayout};
use native_ipc::core::mapping::{BindingError, ReaderRegion, WriterRegion};
use native_ipc::memory::{
    AuthorityMechanism, CleanupPolicy, GrowthPolicy, MemoryAccess, MemoryError, NativeArchitecture,
    NativeMemoryCapabilities, NativePlatform, NativeRegion, NativeShareRequest, PermissionPlan,
    RegionOptions as MemoryRegionOptions, RegionState, RegionStatus, SealPolicy, WriterOwner,
    native_memory_capabilities,
};
use native_ipc::region::{
    GuardCapability, GuardPolicy, PreparedRegion, PrivateRegion, RegionError, RegionId,
    RegionOptions as TransferRegionOptions, RegionSpec, WriterEndpoint,
};
use native_ipc::session::{
    AbsoluteDeadline, ActiveLeaseFacts, AtomicCapabilities, BackendStatus, ChildCleanupFacts,
    ChildExitStatus, Coordinator, CoordinatorAbortOutcome, CoordinatorCloseOutcome,
    CoordinatorSession, DescendantCleanupStatus, ExecutableIdentityPolicy, HARD_MAX_ACTIVE_BYTES,
    HARD_MAX_ACTIVE_REGIONS, HARD_MAX_BATCH_BYTES, HARD_MAX_BOOTSTRAP_PAYLOAD_BYTES,
    HARD_MAX_CONTROL_PAYLOAD_BYTES, HARD_MAX_REGION_BYTES, HARD_MAX_REGIONS_PER_BATCH,
    HARD_MAX_TRANSACTIONS, LeaseFactsConsistency, Negotiating, NegotiationDecision,
    NegotiationError, NegotiationOutcome, PeerStatus, ProtocolVersion, Ready, Receiver,
    ReceiverBootstrap, ReceiverCloseOutcome, ReceiverSession, RejectionReason, Session,
    SessionCommand, SessionEndpoint, SessionError, SessionFailure, SessionLimits, SessionOperation,
    SessionOptions, SessionState, SessionTransactionState, backend_status,
};

fn assert_public_type<T: 'static>() {}

#[test]
fn consumer_type_surface_is_available_on_every_supported_target() {
    assert_public_type::<AccessError>();
    assert_public_type::<ActiveReader>();
    assert_public_type::<ActiveWriter>();
    assert_public_type::<PrefaultResult>();
    assert_public_type::<ActiveRegionSet>();
    assert_public_type::<BatchError>();
    assert_public_type::<ExpectedBatch>();
    assert_public_type::<ExpectedRegion>();
    assert_public_type::<TransferBatch>();
    assert_public_type::<BoundReadMapping>();
    assert_public_type::<BoundWriteMapping>();
    assert_public_type::<BindRejected<ActiveReader>>();
    assert_public_type::<ControlError>();
    assert_public_type::<ControlFrame>();
    assert_public_type::<AuthorityMechanism>();
    assert_public_type::<CleanupPolicy>();
    assert_public_type::<GrowthPolicy>();
    assert_public_type::<MemoryAccess>();
    assert_public_type::<MemoryError>();
    assert_public_type::<NativeArchitecture>();
    assert_public_type::<NativeMemoryCapabilities>();
    assert_public_type::<NativePlatform>();
    assert_public_type::<NativeRegion>();
    assert_public_type::<NativeShareRequest>();
    assert_public_type::<PermissionPlan>();
    assert_public_type::<MemoryRegionOptions>();
    assert_public_type::<RegionState>();
    assert_public_type::<RegionStatus>();
    assert_public_type::<SealPolicy>();
    assert_public_type::<WriterOwner>();
    assert_public_type::<GuardCapability>();
    assert_public_type::<GuardPolicy>();
    assert_public_type::<PreparedRegion>();
    assert_public_type::<PrivateRegion>();
    assert_public_type::<RegionError>();
    assert_public_type::<RegionId>();
    assert_public_type::<TransferRegionOptions>();
    assert_public_type::<RegionSpec>();
    assert_public_type::<WriterEndpoint>();
    assert_public_type::<AbsoluteDeadline>();
    assert_public_type::<ActiveLeaseFacts>();
    assert_public_type::<AtomicCapabilities>();
    assert_public_type::<BackendStatus>();
    assert_public_type::<ChildCleanupFacts>();
    assert_public_type::<ChildExitStatus>();
    assert_public_type::<Coordinator>();
    assert_public_type::<CoordinatorAbortOutcome>();
    assert_public_type::<CoordinatorCloseOutcome>();
    assert_public_type::<CoordinatorSession<Negotiating>>();
    assert_public_type::<DescendantCleanupStatus>();
    assert_public_type::<ExecutableIdentityPolicy>();
    assert_public_type::<LeaseFactsConsistency>();
    assert_public_type::<Negotiating>();
    assert_public_type::<NegotiationDecision>();
    assert_public_type::<NegotiationError>();
    assert_public_type::<NegotiationOutcome<CoordinatorSession<Ready>>>();
    assert_public_type::<PeerStatus>();
    assert_public_type::<ProtocolVersion>();
    assert_public_type::<Ready>();
    assert_public_type::<Receiver>();
    assert_public_type::<ReceiverBootstrap>();
    assert_public_type::<ReceiverCloseOutcome>();
    assert_public_type::<ReceiverSession<Negotiating>>();
    assert_public_type::<RejectionReason>();
    assert_public_type::<Session<Coordinator, Ready>>();
    assert_public_type::<SessionCommand>();
    assert_public_type::<SessionEndpoint>();
    assert_public_type::<SessionError>();
    assert_public_type::<SessionFailure>();
    assert_public_type::<SessionLimits>();
    assert_public_type::<SessionOperation>();
    assert_public_type::<SessionOptions>();
    assert_public_type::<SessionState>();
    assert_public_type::<SessionTransactionState>();

    let _: fn(
        ActiveReader,
        ValidatedRegionLayout,
        RegionSetLayout,
        &mut [u8],
    ) -> Result<ActiveReader, BindingError> = safe_read_binding_chain;
    let _: fn(
        ActiveWriter,
        ValidatedRegionLayout,
        RegionSetLayout,
        &[u8],
    ) -> Result<ActiveWriter, BindingError> = safe_write_binding_chain;

    let _: fn() -> NativeMemoryCapabilities = native_memory_capabilities;
    let _: fn() -> BackendStatus = backend_status;
    let _ = (
        APPLICATION_CONTROL_KIND_MIN,
        HARD_MAX_REGIONS_PER_BATCH,
        HARD_MAX_REGION_BYTES,
        HARD_MAX_BATCH_BYTES,
        HARD_MAX_ACTIVE_REGIONS,
        HARD_MAX_ACTIVE_BYTES,
        HARD_MAX_TRANSACTIONS,
        HARD_MAX_BOOTSTRAP_PAYLOAD_BYTES,
        HARD_MAX_CONTROL_PAYLOAD_BYTES,
    );
}

// Compile-only proof that the safe binding chain (bind -> copy/publish ->
// into_mapping().into_active()) is expressible with the public API alone: no
// `raw-pointer` feature and no consumer-authored unsafe. An `ActiveReader`/
// `ActiveWriter` has no public constructor, so this is exercised at compile
// time only, matching this fixture's cross-target compile contract.
fn safe_read_binding_chain(
    reader: ActiveReader,
    layout: ValidatedRegionLayout,
    topology: RegionSetLayout,
    destination: &mut [u8],
) -> Result<ActiveReader, BindingError> {
    let bound: ReaderRegion<BoundReadMapping> = match reader.bind(layout, topology) {
        Ok(region) => region,
        // The consumed reader is recovered from the boxed rejection.
        Err(rejected) => return Ok(rejected.into_inner()),
    };
    let _copied: usize = bound.copy_payload_into(0, 1, destination)?;
    Ok(bound.into_mapping().into_active())
}

fn safe_write_binding_chain(
    writer: ActiveWriter,
    layout: ValidatedRegionLayout,
    topology: RegionSetLayout,
    payload: &[u8],
) -> Result<ActiveWriter, BindingError> {
    let mut bound: WriterRegion<BoundWriteMapping> = match writer.bind(layout, topology) {
        Ok(region) => region,
        Err(rejected) => return Ok(rejected.into_inner()),
    };
    bound.publish(0, 1, None, payload)?;
    Ok(bound.into_mapping().into_active())
}