use crate::ftl_types::*;
use chrono::NaiveDateTime;
use num_traits::FromPrimitive;
use serde::{de::Deserializer, Deserialize};
use std::time::Duration;
pub fn deserialize_uint_to_bool<'de, D: Deserializer<'de>>(
deserializer: D,
) -> Result<bool, D::Error> {
let result = u64::deserialize(deserializer)?;
Ok(result == 0)
}
pub fn deserialize_string_to_i32<'de, D: Deserializer<'de>>(
deserializer: D,
) -> Result<i32, D::Error> {
let result = String::deserialize(deserializer)?;
Ok(result.parse::<i32>().unwrap())
}
pub fn deserialize_string_to_naive_datetime<'de, D: Deserializer<'de>>(
deserializer: D,
) -> Result<NaiveDateTime, D::Error> {
let result = String::deserialize(deserializer)?;
Ok(NaiveDateTime::from_timestamp(
result.parse::<i64>().unwrap(),
0,
))
}
pub fn deserialize_string_to_dnssec_status<'de, D: Deserializer<'de>>(
deserializer: D,
) -> Result<DNSSECStatus, D::Error> {
let string = String::deserialize(deserializer)?;
let u8_value = string.parse::<u8>().unwrap();
Ok(FromPrimitive::from_u8(u8_value).unwrap())
}
pub fn deserialize_string_to_query_status<'de, D: Deserializer<'de>>(
deserializer: D,
) -> Result<QueryStatus, D::Error> {
let string = String::deserialize(deserializer)?;
let u8_value = string.parse::<u8>().unwrap();
Ok(FromPrimitive::from_u8(u8_value).unwrap())
}
pub fn deserialize_string_to_duration_100_microseconds<'de, D: Deserializer<'de>>(
deserializer: D,
) -> Result<Duration, D::Error> {
let string = String::deserialize(deserializer)?;
let duration_in_100us = string.parse::<u64>().unwrap();
Ok(Duration::from_micros(100 * duration_in_100us))
}
pub fn deserialize_string_to_reply_type<'de, D: Deserializer<'de>>(
deserializer: D,
) -> Result<ReplyType, D::Error> {
let string = String::deserialize(deserializer)?;
let u8_value = string.parse::<u8>().unwrap();
Ok(FromPrimitive::from_u8(u8_value).unwrap())
}