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 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
use super::{Hour, Hour24};
use crate::{Chinese, ChineseFormat, Variant};
use lazy_static::lazy_static;
use std::collections::HashMap;
/// Each of the 8 traditional parts of the day-night cycle.
///
/// This partitioning scheme is mainly used in 12-hour formats,
/// just like the a.m./p.m. in English, but more fine-grained.
///
/// Each day part conventionally lasts 3 hours,
/// starting from `早上` at 5.
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum DayPart {
EarlyMorning,
Morning,
Midday,
Afternoon,
EarlyEvening,
Evening,
Midnight,
LateNight,
}
/// Even though [DayPart] is essentially designed
/// for 12-hour time formats, it can be infallibly obtained
/// only by converting an [Hour24],
/// because the day/night information is required.
///
/// ```
/// use chinese_format::{*, gregorian::*};
///
/// # fn main() -> GenericResult<()> {
/// let hour: Hour24 = 21.try_into()?;
/// let day_part: DayPart = hour.into();
///
/// assert_eq!(day_part.to_chinese(Variant::Simplified), "晚上");
/// assert_eq!(day_part.to_chinese(Variant::Traditional), "晚上");
///
/// # Ok(())
/// # }
/// ```
impl From<Hour24> for DayPart {
fn from(hour24: Hour24) -> Self {
PART_OF_DAY_BY_HOUR[&(hour24.clock_value().0 as u8)]
}
}
/// Each day part can be converted to Chinese logograms,
/// which are independent of the [Variant].
///
/// ```
/// use chinese_format::{*, gregorian::*};
///
/// assert_eq!(
/// DayPart::EarlyMorning.to_chinese(Variant::Simplified),
/// "早上"
/// );
/// assert_eq!(
/// DayPart::EarlyMorning.to_chinese(Variant::Traditional),
/// "早上"
/// );
///
/// assert_eq!(
/// DayPart::Morning.to_chinese(Variant::Simplified),
/// "上午"
/// );
/// assert_eq!(
/// DayPart::Morning.to_chinese(Variant::Traditional),
/// "上午"
/// );
///
/// assert_eq!(
/// DayPart::Midday.to_chinese(Variant::Simplified),
/// "中午"
/// );
/// assert_eq!(
/// DayPart::Midday.to_chinese(Variant::Traditional),
/// "中午"
/// );
///
/// assert_eq!(
/// DayPart::Afternoon.to_chinese(Variant::Simplified),
/// "下午"
/// );
/// assert_eq!(
/// DayPart::Afternoon.to_chinese(Variant::Traditional),
/// "下午"
/// );
///
/// assert_eq!(
/// DayPart::EarlyEvening.to_chinese(Variant::Simplified),
/// "傍晚"
/// );
/// assert_eq!(
/// DayPart::EarlyEvening.to_chinese(Variant::Traditional),
/// "傍晚"
/// );
///
/// assert_eq!(
/// DayPart::Evening.to_chinese(Variant::Simplified),
/// "晚上"
/// );
/// assert_eq!(
/// DayPart::Evening.to_chinese(Variant::Traditional),
/// "晚上"
/// );
///
/// assert_eq!(
/// DayPart::Midnight.to_chinese(Variant::Simplified),
/// "午夜"
/// );
/// assert_eq!(
/// DayPart::Midnight.to_chinese(Variant::Traditional),
/// "午夜"
/// );
///
/// assert_eq!(
/// DayPart::LateNight.to_chinese(Variant::Simplified),
/// "深夜"
/// );
/// assert_eq!(
/// DayPart::LateNight.to_chinese(Variant::Traditional),
/// "深夜"
/// );
/// ```
impl ChineseFormat for DayPart {
fn to_chinese(&self, _variant: Variant) -> Chinese {
Chinese {
logograms: match self {
DayPart::EarlyMorning => "早上",
DayPart::Morning => "上午",
DayPart::Midday => "中午",
DayPart::Afternoon => "下午",
DayPart::EarlyEvening => "傍晚",
DayPart::Evening => "晚上",
DayPart::Midnight => "午夜",
DayPart::LateNight => "深夜",
}
.to_string(),
omissible: false,
}
}
}
lazy_static! {
static ref PART_OF_DAY_BY_HOUR: HashMap<u8, DayPart> = HashMap::from([
(5, DayPart::EarlyMorning),
(6, DayPart::EarlyMorning),
(7, DayPart::EarlyMorning),
(8, DayPart::Morning),
(9, DayPart::Morning),
(10, DayPart::Morning),
(11, DayPart::Midday),
(12, DayPart::Midday),
(13, DayPart::Midday),
(14, DayPart::Afternoon),
(15, DayPart::Afternoon),
(16, DayPart::Afternoon),
(17, DayPart::EarlyEvening),
(18, DayPart::EarlyEvening),
(19, DayPart::EarlyEvening),
(20, DayPart::Evening),
(21, DayPart::Evening),
(22, DayPart::Evening),
(23, DayPart::Midnight),
(0, DayPart::Midnight),
(1, DayPart::Midnight),
(2, DayPart::LateNight),
(3, DayPart::LateNight),
(4, DayPart::LateNight),
]);
}