#![doc(html_root_url = "https://docs.rs/bevy_asky/0.5.0")]
#![doc = include_str!("../README.md")]
#![allow(clippy::type_complexity)]
use bevy::{app::PluginGroupBuilder, prelude::*};
pub mod focus;
#[cfg(feature = "async")]
mod r#async;
pub mod construct;
mod num_like;
pub mod prompt;
pub mod string_cursor;
pub mod view;
#[cfg(feature = "async")]
pub use r#async::*;
#[cfg(feature = "async")]
use futures::channel::oneshot;
mod dest;
pub mod sync;
pub use dest::Dest;
pub mod prelude {
#[cfg(feature = "async")]
pub use super::r#async::*;
pub use super::{
AskyPlugin, AskySet, Dest, Error, Submit, Submitter,
construct::*,
focus::*,
num_like::NumLike,
prompt::*,
sync::{AskyCommands, AskyEntityCommands},
view::{widget::Widgets, *},
};
}
pub struct AskyPlugin;
pub struct AskyPlugins;
impl PluginGroup for AskyPlugins {
fn build(self) -> PluginGroupBuilder {
let group = PluginGroupBuilder::start::<Self>().add(AskyPlugin);
#[cfg(feature = "async")]
let group = group.add(bevy_defer::AsyncPlugin::default_settings());
group
}
}
#[derive(SystemSet, Debug, Clone, PartialEq, Eq, Hash)]
pub enum AskySet {
Controller,
View,
}
impl Plugin for AskyPlugin {
fn build(&self, app: &mut App) {
app.add_plugins(prompt::plugin)
.add_plugins(view::plugin)
.add_plugins(focus::plugin)
.configure_sets(Update, (AskySet::Controller, AskySet::View).chain());
}
}
#[derive(EntityEvent, Debug, Clone)]
pub struct Submit<T> {
pub entity: Entity,
pub state: SubmitState<T>,
}
#[derive(Debug, Clone)]
pub enum SubmitState<T> {
Unhandled(Result<T, Error>),
Handled,
}
impl<T> Submit<T> {
pub fn new(entity: Entity, r: Result<T, Error>) -> Self {
Self {
entity,
state: SubmitState::Unhandled(r),
}
}
pub fn take_result(&mut self) -> Result<T, Error> {
match std::mem::replace(&mut self.state, SubmitState::Handled) {
SubmitState::Unhandled(res) => res,
SubmitState::Handled => Err(Error::SubmitHandled),
}
}
pub fn event(&self) -> &SubmitState<T> {
&self.state
}
pub fn event_mut(&mut self) -> &mut SubmitState<T> {
&mut self.state
}
}
pub unsafe trait Submitter {
type Out;
}
pub trait Part {
type Group: Default + Component;
}
#[derive(Debug, thiserror::Error, Clone)]
pub enum Error {
#[error("canceled")]
Cancel,
#[error("invalid input")]
InvalidInput,
#[error("invalid number")]
InvalidNumber,
#[error("validation fail")]
ValidationFail,
#[error("submit handled")]
SubmitHandled,
#[cfg(feature = "async")]
#[error("channel cancel {0}")]
Channel(#[from] oneshot::Canceled),
}