diff --git a/src/application.rs b/src/application.rs index 63513b618..60a90cdd0 100644 --- a/src/application.rs +++ b/src/application.rs @@ -1,11 +1,11 @@ //! Rustic Abscissa Application -use std::env; +use std::{env, process}; use abscissa_core::{ - application::{self, AppCell}, + application::{self, fatal_error, AppCell}, config::{self, CfgCell}, terminal::component::Terminal, - Application, Component, FrameworkError, StandardPaths, + Application, Component, FrameworkError, Shutdown, StandardPaths, }; use anyhow::Result; @@ -99,4 +99,25 @@ impl Application for RusticApp { Ok(()) } + + /// Shut down this application gracefully + fn shutdown(&self, shutdown: Shutdown) -> ! { + let exit_code = match shutdown { + Shutdown::Crash => 1, + _ => 0, + }; + self.shutdown_with_exitcode(shutdown, exit_code) + } +} + +impl RusticApp { + /// Shut down this application gracefully, exiting with given exit code. + fn shutdown_with_exitcode(&self, shutdown: Shutdown, exit_code: i32) -> ! { + let result = self.state().components().shutdown(self, shutdown); + if let Err(e) = result { + fatal_error(self, &e) + } + + process::exit(exit_code); + } }