use serde::Serialize;
#[derive(Serialize, Debug)]
pub struct ClickTrackingSetting {
enable: bool,
enable_text: bool,
}
#[derive(Serialize, Debug)]
pub struct OpenTrackingSetting {
enable: bool,
substitution_tag: String,
}
#[derive(Serialize, Debug)]
pub struct SubscriptionTrackingSetting {
enable: bool,
text: Option<String>,
html: Option<String>,
substitution_tag: String,
}
#[derive(Serialize, Debug)]
pub struct GaTrackingSetting {
enable: bool,
utm_source: Option<String>,
utm_medium: Option<String>,
utm_term: Option<String>,
utm_content: Option<String>,
utm_campaign: Option<String>,
}
impl Default for GaTrackingSetting {
fn default() -> GaTrackingSetting {
GaTrackingSetting {
enable: true,
utm_source: None,
utm_medium: None,
utm_term: None,
utm_content: None,
utm_campaign: None,
}
}
}
#[derive(Default)]
pub struct GaTrackingSettingBuilder {
setting: GaTrackingSetting,
}
impl GaTrackingSettingBuilder {
pub fn utm_source(mut self, source: impl Into<String>) -> Self {
self.setting.utm_source = Some(source.into());
self
}
pub fn utm_medium(mut self, medium: impl Into<String>) -> Self {
self.setting.utm_medium = Some(medium.into());
self
}
pub fn utm_term(mut self, term: impl Into<String>) -> Self {
self.setting.utm_term = Some(term.into());
self
}
pub fn utm_content(mut self, content: impl Into<String>) -> Self {
self.setting.utm_content = Some(content.into());
self
}
pub fn utm_campaign(mut self, campaign: impl Into<String>) -> Self {
self.setting.utm_campaign = Some(campaign.into());
self
}
pub fn build(self) -> GaTrackingSetting {
self.setting
}
}
#[derive(Serialize, Default, Debug)]
pub struct TrackingSettings {
click_tracking: Option<ClickTrackingSetting>,
open_tracking: Option<OpenTrackingSetting>,
subscription_tracking: Option<SubscriptionTrackingSetting>,
ganalytics: Option<GaTrackingSetting>,
}
#[derive(Default)]
pub struct TrackingSettingsBuilder {
settings: TrackingSettings,
}
impl TrackingSettingsBuilder {
pub fn click_tracking(mut self, enable_text: bool) -> Self {
self.settings.click_tracking = Some(ClickTrackingSetting {
enable: true,
enable_text,
});
self
}
pub fn open_tracking(mut self, substitution_tag: impl Into<String>) -> Self {
self.settings.open_tracking = Some(OpenTrackingSetting {
enable: true,
substitution_tag: substitution_tag.into(),
});
self
}
pub fn substitution_tag(
mut self,
substitution_tag: impl Into<String>,
text: Option<String>,
html: Option<String>,
) -> Self {
self.settings.subscription_tracking = Some(SubscriptionTrackingSetting {
enable: true,
substitution_tag: substitution_tag.into(),
text,
html,
});
self
}
pub fn build(self) -> TrackingSettings {
self.settings
}
}