beet_ml 0.0.8

Machine Learning actions built upon beet_flow
use crate::prelude::*;
use beet_core::prelude::*;
use beet_flow::prelude::*;




/// When [`OnUserMessage`] is triggered, run the [`OnRunAction`],
/// setting the [`OnUserMessage`] as the [`Sentence`].
///
/// ## Warning
/// This requires the [`LanguagePlugin`] to be registered, and
/// that only registers the default payload, others must register
/// [`run_with_user_sentence`] manually.
#[derive(Debug, Component)]
#[require(Sentence)]
pub struct TriggerWithUserSentence<P = GetOutcome> {
	/// The action to trigger.
	pub payload: P,
}

impl Default for TriggerWithUserSentence {
	fn default() -> Self { Self { payload: default() } }
}

impl<P> TriggerWithUserSentence<P> {
	/// Create a new [`RunWithUserSentence`] with the given [`OnRunAction`].
	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")));
	}
}