Files
base64
bitflags
bytes
cfg_if
dtoa
encoding_rs
fnv
foreign_types
foreign_types_shared
futures
futures_channel
futures_core
futures_executor
futures_io
futures_macro
futures_sink
futures_task
futures_util
async_await
future
io
lock
sink
stream
task
goauth
h2
hashbrown
http
http_body
httparse
hyper
hyper_tls
idna
indexmap
iovec
itoa
lazy_static
libc
log
matches
memchr
mime
mime_guess
mio
native_tls
net2
num_cpus
once_cell
openssl
openssl_probe
openssl_sys
percent_encoding
pin_project
pin_project_internal
pin_project_lite
pin_utils
proc_macro2
proc_macro_hack
proc_macro_nested
quote
reqwest
ryu
serde
serde_derive
serde_json
serde_urlencoded
simpl
slab
smpl_jwt
socket2
standback
syn
time
time_macros
time_macros_impl
tinyvec
tokio
future
io
loom
macros
net
park
runtime
stream
sync
task
time
util
tokio_tls
tokio_util
tower_service
tracing
tracing_core
try_lock
unicase
unicode_bidi
unicode_normalization
unicode_xid
url
want
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
//! This module and its contents are not subject to stability guarantees and
//! should not be relied upon.
//!
//! These methods either exist to reduce duplication in code elsewhere or are
//! public only for usage in macros. The reasoning for a method's existence is
//! generally documented alongside the method.
//!
//! Failure to ensure that parameters to the contained functions are in range
//! will likely result in invalid behavior.

#![doc(hidden)]
#![allow(missing_debug_implementations, missing_copy_implementations)]

use crate::{days_in_year, is_leap_year, Weekday};

pub struct Time;

impl Time {
    /// Create a `Time` from its components.
    #[inline(always)]
    pub const fn from_hms_nanos_unchecked(
        hour: u8,
        minute: u8,
        second: u8,
        nanosecond: u32,
    ) -> crate::Time {
        crate::Time {
            hour,
            minute,
            second,
            nanosecond,
        }
    }
}

pub struct Date;

impl Date {
    // macros
    #[inline(always)]
    pub const fn from_yo_unchecked(year: i32, ordinal: u16) -> crate::Date {
        crate::Date { year, ordinal }
    }

    // reduce duplication
    #[inline]
    pub(crate) const fn from_ymd_unchecked(year: i32, month: u8, day: u8) -> crate::Date {
        /// Cumulative days through the beginning of a month in both common and
        /// leap years.
        const DAYS_CUMULATIVE_COMMON_LEAP: [[u16; 12]; 2] = [
            [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334],
            [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335],
        ];

        crate::Date {
            year,
            ordinal: DAYS_CUMULATIVE_COMMON_LEAP[is_leap_year(year) as usize][month as usize - 1]
                + day as u16,
        }
    }

    // reduce duplication
    #[inline]
    pub(crate) fn from_iso_ywd_unchecked(year: i32, week: u8, weekday: Weekday) -> crate::Date {
        let ordinal = week as u16 * 7 + weekday.iso_weekday_number() as u16
            - (Self::from_yo_unchecked(year, 4)
                .weekday()
                .iso_weekday_number() as u16
                + 3);

        if ordinal < 1 {
            return Self::from_yo_unchecked(year - 1, ordinal + days_in_year(year - 1));
        }

        let days_in_cur_year = days_in_year(year);
        if ordinal > days_in_cur_year {
            Self::from_yo_unchecked(year + 1, ordinal - days_in_cur_year)
        } else {
            Self::from_yo_unchecked(year, ordinal)
        }
    }
}