use std::any::{Any, type_name_of_val}; use tonic::async_trait; use crate::util; #[async_trait] pub trait QueryHydrator: Any + Send + Sync where Q: Clone + Send + Sync + 'static, { /// Decide if this query hydrator should run for the given query fn enable(&self, _query: &Q) -> bool { true } /// Hydrate the query by performing async operations. /// Returns a new query with this hydrator's fields populated. async fn hydrate(&self, query: &Q) -> Result; /// Update the query with the hydrated fields. /// Only the fields this hydrator is responsible for should be copied. fn update(&self, query: &mut Q, hydrated: Q); fn name(&self) -> &'static str { util::short_type_name(type_name_of_val(self)) } }