use error_stack::{Result, ResultExt};
use serde::Serialize;
use std::collections::HashMap;
use crate::{error::EventApiError, Conversion, Decision};
use super::Visitor;
const CLIENT_NAME: &str = "rust-sdk";
const CLIENT_VERSION: &str = env!("CARGO_PKG_VERSION");
const ACTIVATE_EVENT_KEY: &str = "campaign_activated";
#[derive(Serialize)]
pub struct Payload {
account_id: String,
visitors: Vec<Visitor>,
enrich_decisions: bool,
anonymize_ip: bool,
client_name: &'static str,
client_version: &'static str,
}
impl Payload {
pub fn new(account_id: String) -> Payload {
Payload {
account_id,
visitors: Vec::new(),
enrich_decisions: true,
anonymize_ip: true,
client_name: CLIENT_NAME,
client_version: CLIENT_VERSION,
}
}
pub fn size(&self) -> usize {
self.visitors.len()
}
pub fn add_conversion_event(&mut self, mut visitor: Visitor, event: Conversion) {
log::debug!("Adding conversion event to payload");
visitor.add_conversion_event(event);
self.visitors.push(visitor);
}
pub fn add_decision_event(&mut self, mut visitor: Visitor, decision: Decision) {
log::debug!("Adding decision event to payload");
let entity_id = decision.campaign_id().to_owned();
visitor.add_decision_event(decision);
let properties = HashMap::default();
let tags = HashMap::default();
let event = Conversion::new(ACTIVATE_EVENT_KEY.to_owned(), entity_id, properties, tags);
visitor.add_conversion_event(event);
self.visitors.push(visitor);
}
pub fn to_string(&self) -> Result<String, EventApiError> {
serde_json::to_string(self).change_context(EventApiError::FailedSerialize)
}
}