use crate::prelude::*;
use beet_core::prelude::*;
use beet_flow::prelude::*;
#[derive(Debug, Component)]
#[require(Sentence)]
pub struct TriggerWithUserSentence<P = GetOutcome> {
pub payload: P,
}
impl Default for TriggerWithUserSentence {
fn default() -> Self { Self { payload: default() } }
}
impl<P> TriggerWithUserSentence<P> {
pub fn new(payload: P) -> Self { Self { payload } }
}
pub fn trigger_with_user_sentence<P: EntityTargetEvent + Clone>(
ev: On<UserMessage>,
mut commands: Commands,
mut query: Query<(Entity, &TriggerWithUserSentence<P>, &mut Sentence)>,
) {
for (action, run_with_user_sentence, mut sentence) in query.iter_mut() {
sentence.0 = (**ev).clone().into();
commands
.entity(action)
.trigger_target(run_with_user_sentence.payload.clone());
}
}
#[cfg(test)]
mod test {
use crate::prelude::*;
use beet_core::prelude::*;
use beet_flow::prelude::*;
#[test]
fn works() {
let mut app = App::new();
app.add_plugins(ControlFlowPlugin::default())
.add_observer(trigger_with_user_sentence::<GetOutcome>);
let world = app.world_mut();
let on_run = observer_ext::observe_triggers::<GetOutcome>(world);
let entity = world
.spawn((TriggerWithUserSentence::default(), EndWith(Outcome::Pass)))
.id();
world.flush();
world.flush_trigger(UserMessage::new("pizza"));
on_run.len().xpect_eq(1);
world
.get::<Sentence>(entity)
.xpect_eq(Some(&Sentence::new("pizza")));
}
}