use bevy::prelude::*;
use crate::attributes::Attributes;
use crate::expr::CompileError;
use crate::modifier::Modifier;
use crate::node::ReduceFn;
use crate::tags::TagMask;
pub trait AttributeWriter {
fn add_modifier(&mut self, attr: &str, modifier: impl Into<Modifier>);
fn add_modifier_tagged(&mut self, attr: &str, modifier: impl Into<Modifier>, tag: TagMask);
fn add_modifier_with_reduce(&mut self, attr: &str, modifier: impl Into<Modifier>, reduce: ReduceFn);
fn add_modifier_tagged_with_reduce(&mut self, attr: &str, modifier: impl Into<Modifier>, tag: TagMask, reduce: ReduceFn);
fn add_expr_modifier(&mut self, attr: &str, expr: &str) -> Result<(), CompileError>;
fn add_expr_modifier_tagged(
&mut self,
attr: &str,
expr: &str,
tag: TagMask,
) -> Result<(), CompileError>;
fn remove_modifier(&mut self, attr: &str, modifier: &Modifier);
fn remove_modifier_tagged(&mut self, attr: &str, modifier: &Modifier, tag: TagMask);
fn set(&mut self, attr: &str, value: f32);
fn set_tagged(&mut self, attr: &str, value: f32, tag: TagMask);
fn set_base(&mut self, attr: &str, value: f32);
fn set_base_tagged(&mut self, attr: &str, value: f32, tag: TagMask);
fn flat_attribute(&mut self, name: &str, value: f32);
fn complex_attribute(
&mut self,
name: &str,
parts: &[(&str, ReduceFn)],
expr: &str,
) -> Result<(), CompileError>;
fn tagged_attribute(
&mut self,
name: &str,
parts: &[(&str, ReduceFn)],
expr: &str,
) -> Result<(), CompileError>;
fn register_source(&mut self, alias: &str, source: Entity);
fn unregister_source(&mut self, alias: &str);
fn resolve_source(&self, alias: &str) -> Option<Entity>;
fn get_attributes(&self) -> Option<&Attributes>;
fn value(&self, attr: &str) -> f32;
fn try_evaluate(&mut self, attr: &str) -> Option<f32>;
fn evaluate(&mut self, attr: &str) -> f32;
fn evaluate_tagged(&mut self, attr: &str, query: TagMask) -> f32;
}
pub struct BoundAttributesMut<'a, 'w, 's, F: bevy::ecs::query::QueryFilter + 'static = ()> {
pub(crate) entity: Entity,
pub(crate) attrs: &'a mut crate::attributes_mut::AttributesMut<'w, 's, F>,
}
impl<F: bevy::ecs::query::QueryFilter + 'static> AttributeWriter for BoundAttributesMut<'_, '_, '_, F> {
fn add_modifier(&mut self, attr: &str, modifier: impl Into<Modifier>) {
self.attrs.add_modifier(self.entity, attr, modifier);
}
fn add_modifier_tagged(&mut self, attr: &str, modifier: impl Into<Modifier>, tag: TagMask) {
self.attrs.add_modifier_tagged(self.entity, attr, modifier, tag);
}
fn add_modifier_with_reduce(&mut self, attr: &str, modifier: impl Into<Modifier>, reduce: ReduceFn) {
self.attrs.add_modifier_with_reduce(self.entity, attr, modifier, reduce);
}
fn add_modifier_tagged_with_reduce(&mut self, attr: &str, modifier: impl Into<Modifier>, tag: TagMask, reduce: ReduceFn) {
self.attrs.add_modifier_tagged_with_reduce(self.entity, attr, modifier, tag, reduce);
}
fn add_expr_modifier(&mut self, attr: &str, expr: &str) -> Result<(), CompileError> {
self.attrs.add_expr_modifier(self.entity, attr, expr)
}
fn add_expr_modifier_tagged(
&mut self,
attr: &str,
expr: &str,
tag: TagMask,
) -> Result<(), CompileError> {
self.attrs.add_expr_modifier_tagged(self.entity, attr, expr, tag)
}
fn remove_modifier(&mut self, attr: &str, modifier: &Modifier) {
self.attrs.remove_modifier(self.entity, attr, modifier);
}
fn remove_modifier_tagged(&mut self, attr: &str, modifier: &Modifier, tag: TagMask) {
self.attrs.remove_modifier_tagged(self.entity, attr, modifier, tag);
}
fn set(&mut self, attr: &str, value: f32) {
self.attrs.set(self.entity, attr, value);
}
fn set_tagged(&mut self, attr: &str, value: f32, tag: TagMask) {
self.attrs.set_tagged(self.entity, attr, value, tag);
}
fn set_base(&mut self, attr: &str, value: f32) {
self.attrs.set_base(self.entity, attr, value);
}
fn set_base_tagged(&mut self, attr: &str, value: f32, tag: TagMask) {
self.attrs.set_base_tagged(self.entity, attr, value, tag);
}
fn flat_attribute(&mut self, name: &str, value: f32) {
self.attrs.flat_attribute(self.entity, name, value);
}
fn complex_attribute(
&mut self,
name: &str,
parts: &[(&str, ReduceFn)],
expr: &str,
) -> Result<(), CompileError> {
self.attrs.complex_attribute(self.entity, name, parts, expr)
}
fn tagged_attribute(
&mut self,
name: &str,
parts: &[(&str, ReduceFn)],
expr: &str,
) -> Result<(), CompileError> {
self.attrs.tagged_attribute(self.entity, name, parts, expr)
}
fn register_source(&mut self, alias: &str, source: Entity) {
self.attrs.register_source(self.entity, alias, source);
}
fn unregister_source(&mut self, alias: &str) {
self.attrs.unregister_source(self.entity, alias);
}
fn resolve_source(&self, alias: &str) -> Option<Entity> {
self.attrs.resolve_source(self.entity, alias)
}
fn get_attributes(&self) -> Option<&Attributes> {
self.attrs.get_attributes(self.entity)
}
fn value(&self, attr: &str) -> f32 {
self.attrs.value(self.entity, attr)
}
fn try_evaluate(&mut self, attr: &str) -> Option<f32> {
self.attrs.try_evaluate(self.entity, attr)
}
fn evaluate(&mut self, attr: &str) -> f32 {
self.attrs.evaluate(self.entity, attr)
}
fn evaluate_tagged(&mut self, attr: &str, query: TagMask) -> f32 {
self.attrs.evaluate_tagged(self.entity, attr, query)
}
}