use chrono::{DateTime, Utc};
use serde_json::Value;
use crate::keys::LOGIN_TYPE_DEFAULT;
#[derive(Debug, Clone)]
pub struct LoginRequest {
pub login_id: String,
pub login_type: String,
pub device: Option<String>,
pub extra_data: Option<Value>,
pub nonce: Option<String>,
pub expire_time: Option<DateTime<Utc>>,
pub preset_token: Option<String>,
}
impl LoginRequest {
pub fn new(login_id: impl Into<String>) -> Self {
Self {
login_id: login_id.into(),
login_type: LOGIN_TYPE_DEFAULT.to_string(),
device: None,
extra_data: None,
nonce: None,
expire_time: None,
preset_token: None,
}
}
pub fn login_type(mut self, login_type: impl Into<String>) -> Self {
self.login_type = login_type.into();
self
}
pub fn device(mut self, device: impl Into<String>) -> Self {
self.device = Some(device.into());
self
}
pub fn extra_data(mut self, data: Value) -> Self {
self.extra_data = Some(data);
self
}
pub fn nonce(mut self, nonce: impl Into<String>) -> Self {
self.nonce = Some(nonce.into());
self
}
pub fn expire_time(mut self, t: DateTime<Utc>) -> Self {
self.expire_time = Some(t);
self
}
pub fn preset_token(mut self, token: impl Into<String>) -> Self {
self.preset_token = Some(token.into());
self
}
pub fn effective_login_type(&self) -> &str {
if self.login_type.is_empty() {
LOGIN_TYPE_DEFAULT
} else {
&self.login_type
}
}
pub fn effective_device(&self) -> Option<&str> {
self.device.as_deref().filter(|d| !d.is_empty())
}
}