Make Application and Sandbox return a Result

This commit is contained in:
Héctor Ramón Jiménez 2020-09-08 00:35:17 +02:00
parent faa12382d4
commit c1f79b40cf
40 changed files with 166 additions and 58 deletions

View file

@ -1,6 +1,5 @@
use crate::{
window, Color, Command, Element, Executor, Settings, Subscription,
};
use crate::window;
use crate::{Color, Command, Element, Executor, Settings, Subscription};
/// An interactive cross-platform application.
///
@ -59,7 +58,7 @@ use crate::{
/// ```no_run
/// use iced::{executor, Application, Command, Element, Settings, Text};
///
/// pub fn main() {
/// pub fn main() -> iced::Result {
/// Hello::run(Settings::default())
/// }
///
@ -204,12 +203,13 @@ pub trait Application: Sized {
/// Runs the [`Application`].
///
/// On native platforms, this method will take control of the current thread
/// and __will NOT return__.
/// and __will NOT return__ unless there is an [`Error`] during startup.
///
/// It should probably be that last thing you call in your `main` function.
///
/// [`Application`]: trait.Application.html
fn run(settings: Settings<Self::Flags>)
/// [`Error`]: enum.Error.html
fn run(settings: Settings<Self::Flags>) -> crate::Result
where
Self: 'static,
{
@ -226,15 +226,19 @@ pub trait Application: Sized {
..crate::renderer::Settings::default()
};
crate::runtime::application::run::<
Ok(crate::runtime::application::run::<
Instance<Self>,
Self::Executor,
crate::renderer::window::Compositor,
>(settings.into(), renderer_settings);
>(settings.into(), renderer_settings)?)
}
#[cfg(target_arch = "wasm32")]
<Instance<Self> as iced_web::Application>::run(settings.flags);
{
<Instance<Self> as iced_web::Application>::run(settings.flags);
Ok(())
}
}
}

34
src/error.rs Normal file
View file

@ -0,0 +1,34 @@
use iced_futures::futures;
/// An error that occurred while running an application.
#[derive(Debug, thiserror::Error)]
pub enum Error {
/// The futures executor could not be created.
#[error("the futures executor could not be created")]
ExecutorCreationFailed(futures::io::Error),
/// The application window could not be created.
#[error("the application window could not be created")]
WindowCreationFailed(Box<dyn std::error::Error>),
/// A suitable graphics adapter or device could not be found.
#[error("a suitable graphics adapter or device could not be found")]
GraphicsAdapterNotFound,
}
#[cfg(not(target_arch = "wasm32"))]
impl From<iced_winit::Error> for Error {
fn from(error: iced_winit::Error) -> Error {
match error {
iced_winit::Error::ExecutorCreationFailed(error) => {
Error::ExecutorCreationFailed(error)
}
iced_winit::Error::WindowCreationFailed(error) => {
Error::WindowCreationFailed(Box::new(error))
}
iced_winit::Error::GraphicsAdapterNotFound => {
Error::GraphicsAdapterNotFound
}
}
}
}

View file

@ -181,6 +181,8 @@
#![cfg_attr(docsrs, feature(doc_cfg))]
mod application;
mod element;
mod error;
mod result;
mod sandbox;
pub mod executor;
@ -225,7 +227,9 @@ pub use widget::*;
pub use application::Application;
pub use element::Element;
pub use error::Error;
pub use executor::Executor;
pub use result::Result;
pub use sandbox::Sandbox;
pub use settings::Settings;

6
src/result.rs Normal file
View file

@ -0,0 +1,6 @@
use crate::Error;
/// The result of running an [`Application`].
///
/// [`Application`]: trait.Application.html
pub type Result = std::result::Result<(), Error>;

View file

@ -1,5 +1,6 @@
use crate::executor;
use crate::{
executor, Application, Color, Command, Element, Settings, Subscription,
Application, Color, Command, Element, Error, Settings, Subscription,
};
/// A sandboxed [`Application`].
@ -64,7 +65,7 @@ use crate::{
/// ```no_run
/// use iced::{Element, Sandbox, Settings, Text};
///
/// pub fn main() {
/// pub fn main() -> iced::Result {
/// Hello::run(Settings::default())
/// }
///
@ -159,7 +160,7 @@ pub trait Sandbox {
/// It should probably be that last thing you call in your `main` function.
///
/// [`Sandbox`]: trait.Sandbox.html
fn run(settings: Settings<()>)
fn run(settings: Settings<()>) -> Result<(), Error>
where
Self: 'static + Sized,
{