impl MixpanelEvent {
pub fn parse_fn(
context: TransformContext,
- ) -> impl Fn(Self) -> Result<InternallyCapturedEvent, Error> {
+ skip_no_distinct_id: bool,
+ event_transform: impl Fn(RawEvent) -> Result<Option<RawEvent>, Error>,
+ ) -> impl Fn(Self) -> Result<Option<InternallyCapturedEvent>, Error> {
move |mx| {
let token = context.token.clone();
let team_id = context.team_id;
- // Getting entropy is surprisingly expensive, so don't do it a lot unless we have to
- let generated_id = Uuid::now_v7();
-
- let distinct_id = mx
- .properties
- .distinct_id
- .as_ref()
- .cloned()
- .unwrap_or(format!("mixpanel-generated-{}", generated_id));
+ let distinct_id = match (
+ mx.properties.distinct_id.as_ref().cloned(),
+ skip_no_distinct_id,
+ ) {
+ (Some(distinct_id), _) => distinct_id,
+ (None, true) => return Ok(None),
+ (None, false) => Uuid::now_v7().to_string(),
+ };
+ let generated_id = Uuid::now_v7();
// We don't support subsecond precision for historical imports
let timestamp = DateTime::<Utc>::from_timestamp(mx.properties.timestamp_ms / 1000, 0)
.ok_or(Error::msg("Invalid timestamp"))?;