use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct AccessLogEntry {
pub timestamp: u64,
pub ip: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub action: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub result: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub country: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub city: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<serde_json::Value>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct AccessLogResponse {
pub data: Vec<AccessLogEntry>,
#[serde(skip_serializing_if = "Option::is_none")]
pub continuation: Option<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_access_log_entry_deserialization() {
let json = r#"{
"timestamp": 1550058362000,
"ip": "192.168.1.1",
"action": "login",
"result": "success",
"country": "US",
"city": "New York"
}"#;
let entry: AccessLogEntry = serde_json::from_str(json).expect("Failed to parse");
assert_eq!(entry.timestamp, 1550058362000);
assert_eq!(entry.ip, "192.168.1.1");
assert_eq!(entry.action, Some("login".to_string()));
}
#[test]
fn test_access_log_response_deserialization() {
let json = r#"{
"data": [
{
"timestamp": 1000000,
"ip": "10.0.0.1"
}
],
"continuation": "abc123"
}"#;
let response: AccessLogResponse = serde_json::from_str(json).expect("Failed to parse");
assert_eq!(response.data.len(), 1);
assert_eq!(response.continuation, Some("abc123".to_string()));
}
}