alma 0.1.1

A Bevy-native modal text editor with Vim-style navigation.
Documentation
//! Application lifecycle request messages.

use bevy::{app::AppExit, prelude::Message};

/// Request for an application lifecycle transition.
#[derive(Clone, Copy, Debug, Eq, Message, PartialEq)]
pub enum LifecycleRequested {
    /// Begin application shutdown.
    Shutdown(ShutdownRequest),
}

/// Typed shutdown request accepted by the app lifecycle owner.
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct ShutdownRequest {
    /// Exit status to report to Bevy.
    status: ShutdownStatus,
    /// Boundary that requested shutdown.
    reason: ShutdownReason,
}

impl ShutdownRequest {
    /// Creates a successful shutdown requested by an editor command.
    pub const fn successful_user_command() -> Self {
        Self {
            status: ShutdownStatus::Success,
            reason: ShutdownReason::UserCommand,
        }
    }

    /// Converts this request into Bevy's app-exit status.
    pub const fn app_exit(self) -> AppExit {
        match self.status {
            ShutdownStatus::Success => AppExit::Success,
        }
    }

    /// Returns the reason shutdown was requested.
    pub const fn reason(self) -> ShutdownReason {
        self.reason
    }
}

/// Process exit status for a typed shutdown request.
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
enum ShutdownStatus {
    /// Exit successfully.
    Success,
}

/// Source of an accepted shutdown request.
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum ShutdownReason {
    /// Shutdown was requested by a user-facing editor command.
    UserCommand,
}