use super::DateTime;
use crate::error::DateTimeError;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use time::UtcOffset;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct DateTimeBuilder {
year: i32,
month: u8,
day: u8,
hour: u8,
minute: u8,
second: u8,
offset: UtcOffset,
}
impl Default for DateTimeBuilder {
fn default() -> Self {
Self::new()
}
}
impl DateTimeBuilder {
#[must_use]
pub const fn new() -> Self {
Self {
year: 1970,
month: 1,
day: 1,
hour: 0,
minute: 0,
second: 0,
offset: UtcOffset::UTC,
}
}
#[must_use]
pub const fn year(mut self, year: i32) -> Self {
self.year = year;
self
}
#[must_use]
pub const fn month(mut self, month: u8) -> Self {
self.month = month;
self
}
#[must_use]
pub const fn day(mut self, day: u8) -> Self {
self.day = day;
self
}
#[must_use]
pub const fn hour(mut self, hour: u8) -> Self {
self.hour = hour;
self
}
#[must_use]
pub const fn minute(mut self, minute: u8) -> Self {
self.minute = minute;
self
}
#[must_use]
pub const fn second(mut self, second: u8) -> Self {
self.second = second;
self
}
#[must_use]
pub const fn offset(mut self, offset: UtcOffset) -> Self {
self.offset = offset;
self
}
pub fn build(&self) -> Result<DateTime, DateTimeError> {
DateTime::from_components(
self.year,
self.month,
self.day,
self.hour,
self.minute,
self.second,
self.offset,
)
}
}