use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum Prop {
Str(String),
Int(i64),
Bool(bool),
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Actor {
Human,
Agent,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Kind {
Pageview,
Attention,
#[serde(untagged)]
Custom(String),
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Navigation {
External,
Direct,
Internal,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct AgentDecl {
pub name: String,
pub operator: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct Attention {
pub ms: u64,
pub scroll_depth: u8,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Revenue {
pub amount: i64,
pub currency: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Utm {
#[serde(skip_serializing_if = "Option::is_none")]
pub source: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub medium: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub campaign: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub term: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EventBody {
pub neuron: String,
pub actor: Actor,
#[serde(skip_serializing_if = "Option::is_none")]
pub agent: Option<AgentDecl>,
pub kind: Kind,
#[serde(skip_serializing_if = "Option::is_none")]
pub navigation: Option<Navigation>,
pub hostname: String,
pub pathname: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub referrer: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub utm: Option<Utm>,
#[serde(skip_serializing_if = "Option::is_none")]
pub attention: Option<Attention>,
#[serde(skip_serializing_if = "Option::is_none")]
pub props: Option<BTreeMap<String, Prop>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub revenue: Option<Revenue>,
pub timestamp: u64,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct Pow {
pub nonce: u64,
pub difficulty: u64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Event {
#[serde(flatten)]
pub body: EventBody,
pub pow: Pow,
pub pubkey: String,
pub signature: String,
}
impl Event {
pub fn body_bytes(&self) -> Vec<u8> {
crate::encode_body(&self.body)
}
}