use serde::Deserialize;
use serde_with::{serde_as, DisplayFromStr, PickFirst};
#[serde_as]
#[derive(Debug, Clone, Deserialize)]
pub struct ActionPage {
pub label: String,
#[serde(default)]
pub nb_visits: i64,
#[serde(default)]
pub nb_hits: i64,
#[serde(default)]
pub sum_time_spent: i64,
#[serde(default)]
pub entry_nb_visits: i64,
#[serde(default)]
pub entry_nb_actions: i64,
#[serde(default)]
pub exit_nb_visits: i64,
#[serde_as(as = "Option<PickFirst<(_, DisplayFromStr)>>")]
#[serde(default)]
pub avg_time_on_page: Option<f64>,
#[serde(default)]
pub bounce_rate: Option<String>,
#[serde(default)]
pub exit_rate: Option<String>,
#[serde(default)]
pub url: Option<String>,
#[serde(default)]
pub segment: Option<String>,
#[serde(default)]
pub idsubdatatable: Option<i64>,
#[serde(default)]
pub subtable: Option<Vec<ActionPage>>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct Download {
pub label: String,
#[serde(default)]
pub nb_visits: i64,
#[serde(default)]
pub nb_hits: i64,
#[serde(default)]
pub sum_time_spent: i64,
#[serde(default)]
pub url: Option<String>,
#[serde(default)]
pub idsubdatatable: Option<i64>,
#[serde(default)]
pub subtable: Option<Vec<Download>>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct Outlink {
pub label: String,
#[serde(default)]
pub nb_visits: i64,
#[serde(default)]
pub nb_hits: i64,
#[serde(default)]
pub sum_time_spent: i64,
#[serde(default)]
pub url: Option<String>,
#[serde(default)]
pub idsubdatatable: Option<i64>,
#[serde(default)]
pub subtable: Option<Vec<Outlink>>,
}