@@ -31,6 +31,17 @@ pub fn normalize_pre_release_label(label: &str) -> Option<PreReleaseLabel> {
3131 }
3232}
3333
34+ fn parse_timestamp_component (
35+ dt : & chrono:: DateTime < chrono:: Utc > ,
36+ format_str : & str ,
37+ component_type : & str ,
38+ ) -> Result < u64 > {
39+ dt. format ( format_str)
40+ . to_string ( )
41+ . parse ( )
42+ . map_err ( |_| ZervError :: InvalidFormat ( format ! ( "Failed to parse {component_type}" ) ) )
43+ }
44+
3445pub fn resolve_timestamp ( pattern : & str , timestamp : Option < u64 > ) -> Result < u64 > {
3546 let ts = timestamp. ok_or_else ( || {
3647 ZervError :: InvalidFormat ( "Timestamp is required but was None" . to_string ( ) )
@@ -39,76 +50,20 @@ pub fn resolve_timestamp(pattern: &str, timestamp: Option<u64>) -> Result<u64> {
3950 . ok_or_else ( || ZervError :: InvalidFormat ( "Invalid timestamp" . to_string ( ) ) ) ?;
4051
4152 let result = match pattern {
42- "YYYY" => dt
43- . format ( "%Y" )
44- . to_string ( )
45- . parse ( )
46- . map_err ( |_| ZervError :: InvalidFormat ( "Failed to parse year" . to_string ( ) ) ) ?,
47- "YY" => dt
48- . format ( "%y" )
49- . to_string ( )
50- . parse ( )
51- . map_err ( |_| ZervError :: InvalidFormat ( "Failed to parse year" . to_string ( ) ) ) ?,
52- "MM" => dt
53- . format ( "%-m" )
54- . to_string ( )
55- . parse ( )
56- . map_err ( |_| ZervError :: InvalidFormat ( "Failed to parse month" . to_string ( ) ) ) ?,
57- "0M" => dt
58- . format ( "%m" )
59- . to_string ( )
60- . parse ( )
61- . map_err ( |_| ZervError :: InvalidFormat ( "Failed to parse month" . to_string ( ) ) ) ?,
62- "WW" => dt
63- . format ( "%-W" )
64- . to_string ( )
65- . parse ( )
66- . map_err ( |_| ZervError :: InvalidFormat ( "Failed to parse week" . to_string ( ) ) ) ?,
67- "0W" => dt
68- . format ( "%W" )
69- . to_string ( )
70- . parse ( )
71- . map_err ( |_| ZervError :: InvalidFormat ( "Failed to parse week" . to_string ( ) ) ) ?,
72- "DD" => dt
73- . format ( "%-d" )
74- . to_string ( )
75- . parse ( )
76- . map_err ( |_| ZervError :: InvalidFormat ( "Failed to parse day" . to_string ( ) ) ) ?,
77- "0D" => dt
78- . format ( "%d" )
79- . to_string ( )
80- . parse ( )
81- . map_err ( |_| ZervError :: InvalidFormat ( "Failed to parse day" . to_string ( ) ) ) ?,
82- "HH" => dt
83- . format ( "%-H" )
84- . to_string ( )
85- . parse ( )
86- . map_err ( |_| ZervError :: InvalidFormat ( "Failed to parse hour" . to_string ( ) ) ) ?,
87- "0H" => dt
88- . format ( "%H" )
89- . to_string ( )
90- . parse ( )
91- . map_err ( |_| ZervError :: InvalidFormat ( "Failed to parse hour" . to_string ( ) ) ) ?,
92- "mm" => dt
93- . format ( "%-M" )
94- . to_string ( )
95- . parse ( )
96- . map_err ( |_| ZervError :: InvalidFormat ( "Failed to parse minute" . to_string ( ) ) ) ?,
97- "0m" => dt
98- . format ( "%M" )
99- . to_string ( )
100- . parse ( )
101- . map_err ( |_| ZervError :: InvalidFormat ( "Failed to parse minute" . to_string ( ) ) ) ?,
102- "SS" => dt
103- . format ( "%-S" )
104- . to_string ( )
105- . parse ( )
106- . map_err ( |_| ZervError :: InvalidFormat ( "Failed to parse second" . to_string ( ) ) ) ?,
107- "0S" => dt
108- . format ( "%S" )
109- . to_string ( )
110- . parse ( )
111- . map_err ( |_| ZervError :: InvalidFormat ( "Failed to parse second" . to_string ( ) ) ) ?,
53+ "YYYY" => parse_timestamp_component ( & dt, "%Y" , "year" ) ?,
54+ "YY" => parse_timestamp_component ( & dt, "%y" , "year" ) ?,
55+ "MM" => parse_timestamp_component ( & dt, "%-m" , "month" ) ?,
56+ "0M" => parse_timestamp_component ( & dt, "%m" , "month" ) ?,
57+ "WW" => parse_timestamp_component ( & dt, "%-W" , "week" ) ?,
58+ "0W" => parse_timestamp_component ( & dt, "%W" , "week" ) ?,
59+ "DD" => parse_timestamp_component ( & dt, "%-d" , "day" ) ?,
60+ "0D" => parse_timestamp_component ( & dt, "%d" , "day" ) ?,
61+ "HH" => parse_timestamp_component ( & dt, "%-H" , "hour" ) ?,
62+ "0H" => parse_timestamp_component ( & dt, "%H" , "hour" ) ?,
63+ "mm" => parse_timestamp_component ( & dt, "%-M" , "minute" ) ?,
64+ "0m" => parse_timestamp_component ( & dt, "%M" , "minute" ) ?,
65+ "SS" => parse_timestamp_component ( & dt, "%-S" , "second" ) ?,
66+ "0S" => parse_timestamp_component ( & dt, "%S" , "second" ) ?,
11267 _ => {
11368 return Err ( ZervError :: InvalidFormat ( format ! (
11469 "Unknown timestamp pattern: {pattern}"
0 commit comments