simplify the trait a bit more by getting rids of the downcast_aggregate method

This commit is contained in:
Tamo 2024-10-20 17:36:29 +02:00
parent 73b5722896
commit ac919df37d
2 changed files with 17 additions and 21 deletions

View File

@ -93,26 +93,6 @@ pub trait Aggregate: 'static + mopa::Any + Send {
where
Self: Sized;
/// An internal helper function, you shouldn't implement it yourself.
/// This function should always be called on the same type. If `this` and `other`
/// aren't the same type behind the function will do nothing and return `None`.
fn downcast_aggregate(
old: Box<dyn Aggregate>,
new: Box<dyn Aggregate>,
) -> Option<Box<dyn Aggregate>>
where
Self: Sized,
{
if old.is::<Self>() && new.is::<Self>() {
// Both the two following lines cannot fail, but just to be sure we don't crash, we're still avoiding unwrapping
let this = old.downcast::<Self>().ok()?;
let other = new.downcast::<Self>().ok()?;
Some(Self::aggregate(this, other))
} else {
None
}
}
/// Converts your structure to the final event that'll be sent to segment.
fn into_event(self: Box<Self>) -> serde_json::Value;
}

View File

@ -82,6 +82,22 @@ pub struct Event {
total: usize,
}
/// This function should always be called on the same type. If `this` and `other`
/// aren't the same type the function will do nothing and return `None`.
fn downcast_aggregate<ConcreteType: Aggregate>(
old: Box<dyn Aggregate>,
new: Box<dyn Aggregate>,
) -> Option<Box<dyn Aggregate>> {
if old.is::<ConcreteType>() && new.is::<ConcreteType>() {
// Both the two following lines cannot fail, but just to be sure we don't crash, we're still avoiding unwrapping
let this = old.downcast::<ConcreteType>().ok()?;
let other = new.downcast::<ConcreteType>().ok()?;
Some(ConcreteType::aggregate(this, other))
} else {
None
}
}
impl Message {
pub fn new<T: Aggregate>(event: T, request: &HttpRequest) -> Self {
Self {
@ -92,7 +108,7 @@ impl Message {
user_agents: extract_user_agents(request),
total: 1,
},
aggregator_function: T::downcast_aggregate,
aggregator_function: downcast_aggregate::<T>,
}
}
}