Make Application and Sandbox return a Result
This commit is contained in:
parent
faa12382d4
commit
c1f79b40cf
40 changed files with 166 additions and 58 deletions
|
|
@ -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
34
src/error.rs
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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
6
src/result.rs
Normal 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>;
|
||||
|
|
@ -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,
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue