You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: app_lifetime_manager.rs
    path of file: ./repos/mmb/core/src/lifecycle
    
    the code of the file until where you have to start completion: use futures::{Future, FutureExt};
use mmb_utils::nothing_to_do;
use tokio::sync::{Mutex, MutexGuard};
use tokio::task::JoinHandle;

use std::panic;
use std::sync::{Arc, Weak};

use crate::lifecycle::trading_engine::EngineContext;
use mmb_utils::cancellation_token::CancellationToken;

#[derive(Clone, Copy, Debug)]
pub enum ActionAfterGracefulShutdown {
    Nothing,
    Resta
    
    pub async fn run_graceful_shutdown(&self, reason: &str) {
        let engine_context_guard = self.engine_context.lock().await;
        let fut_opt = start_graceful_shutdown_inner(
            engine_context_guard,
            reason,
            ActionAfterGracefulShutdown::Nothing,
            self.futures_cancellation_token.clone(),
        );
        match fut_opt {
            None => nothing_to_do(),
            Some(fut) => fut.await,
        }
    }