#![deny(
clippy::allow_attributes_without_reason,
clippy::correctness,
unreachable_pub,
unsafe_code,
)]
#![warn(
clippy::complexity,
clippy::nursery,
clippy::pedantic,
clippy::perf,
clippy::style,
clippy::allow_attributes,
clippy::clone_on_ref_ptr,
clippy::create_dir,
clippy::filetype_is_file,
clippy::format_push_string,
clippy::get_unwrap,
clippy::impl_trait_in_params,
clippy::implicit_clone,
clippy::lossy_float_literal,
clippy::missing_assert_message,
clippy::missing_docs_in_private_items,
clippy::needless_raw_strings,
clippy::panic_in_result_fn,
clippy::pub_without_shorthand,
clippy::rest_pat_in_fully_bound_structs,
clippy::semicolon_inside_block,
clippy::str_to_string,
clippy::todo,
clippy::undocumented_unsafe_blocks,
clippy::unneeded_field_pattern,
clippy::unseparated_literal_suffix,
clippy::unwrap_in_result,
macro_use_extern_crate,
missing_copy_implementations,
missing_docs,
non_ascii_idents,
trivial_casts,
trivial_numeric_casts,
unused_crate_dependencies,
unused_extern_crates,
unused_import_braces,
)]
#![expect(clippy::redundant_pub_crate, reason = "Unresolvable.")]
#![cfg_attr(docsrs, feature(doc_cfg))]
mod chr;
mod date;
mod error;
mod month;
mod period;
mod weekday;
mod year;
mod macros;
#[cfg(any(test, feature = "serde"))]
#[cfg_attr(docsrs, doc(cfg(feature = "serde")))]
mod serde;
#[cfg(feature = "sqlx")]
#[cfg_attr(docsrs, doc(cfg(feature = "sqlx")))]
mod sqlx;
use chr::DateChar;
pub use date::{
FmtUtc2k,
Utc2k,
};
pub use error::{
Utc2kError,
Utc2kFormatError,
};
pub use month::Month;
pub use period::Period;
pub use weekday::Weekday;
use year::Year;
#[cfg(feature = "local")]
#[cfg_attr(docsrs, doc(cfg(feature = "local")))]
pub use date::local::{
FmtLocal2k,
Local2k,
};
#[cfg(test)] use brunch as _;
pub const MINUTE_IN_SECONDS: u32 = 60;
pub const HOUR_IN_SECONDS: u32 = 3600;
pub const DAY_IN_SECONDS: u32 = 86_400;
pub const WEEK_IN_SECONDS: u32 = 604_800;
pub const YEAR_IN_SECONDS: u32 = 31_536_000;
const ASCII_LOWER: u32 = 0x2020_2000;
const JULIAN_OFFSET: u32 = 2_440_588 - 1_721_119;
const YEAR_IN_DAYS_P2: u32 = 36_525;
const YEAR_IN_DAYS_P4: u32 = 3_652_425;
#[expect(
clippy::cast_lossless,
clippy::cast_possible_truncation,
reason = "False positive.",
)]
#[must_use]
pub fn unixtime() -> u32 {
use std::time::SystemTime;
SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).map_or(
Utc2k::MIN_UNIXTIME,
|n| n.as_secs().clamp(Utc2k::MIN_UNIXTIME as u64, Utc2k::MAX_UNIXTIME as u64) as u32
)
}
#[expect(clippy::cast_possible_truncation, reason = "False positive.")]
#[must_use]
pub fn year() -> u16 {
let z = unixtime().wrapping_div(DAY_IN_SECONDS) + JULIAN_OFFSET;
let h: u32 = 100 * z - 25;
let mut a: u32 = h.wrapping_div(YEAR_IN_DAYS_P4);
a -= a.wrapping_div(4);
let year: u32 = (100 * a + h).wrapping_div(YEAR_IN_DAYS_P2);
a = a + z - 365 * year - year.wrapping_div(4);
let month = (5 * a + 456).wrapping_div(153);
year as u16 + u16::from(12 < month)
}
#[expect(clippy::inline_always, reason = "Foundational.")]
#[inline(always)]
#[must_use]
const fn needle3(a: u8, b: u8, c: u8) -> u32 {
u32::from_le_bytes([0, a, b, c]) | ASCII_LOWER
}
#[cfg(test)]
mod test {
use super::*;
use std::time::SystemTime;
#[test]
fn t_needle3() {
assert_eq!(
ASCII_LOWER.to_le_bytes(),
[0, 0b0010_0000, 0b0010_0000, 0b0010_0000],
);
assert_eq!(
needle3(b'J', b'E', b'B'),
u32::from_le_bytes([0, b'j', b'e', b'b']),
);
assert_eq!(
needle3(b'j', b'e', b'b'),
u32::from_le_bytes([0, b'j', b'e', b'b']),
);
}
#[test]
fn t_unixtime() {
let our_secs = unixtime();
let secs: u32 = SystemTime::now()
.duration_since(SystemTime::UNIX_EPOCH)
.expect("The system time is set to the deep past!")
.as_secs()
.try_into()
.expect("The system clock is set to the distant future!");
assert!(
(Utc2k::MIN_UNIXTIME..=Utc2k::MAX_UNIXTIME).contains(&secs),
"Bug: the system clock is completely wrong!",
);
assert!(
our_secs.abs_diff(secs) <= 10,
"SystemTime and unixtime are more different than expected!",
);
}
}