19
19
20
20
use crate :: cal:: chinese_based:: {
21
21
chinese_based_ordinal_lunar_month_from_code, ChineseBasedDateInner ,
22
- ChineseBasedPrecomputedData , ChineseBasedWithDataLoading , ChineseBasedYearInfo ,
22
+ ChineseBasedPrecomputedData , ChineseBasedWithDataLoading ,
23
23
} ;
24
24
use crate :: cal:: iso:: Iso ;
25
25
use crate :: calendar_arithmetic:: CalendarArithmetic ;
@@ -173,9 +173,9 @@ impl Calendar for Chinese {
173
173
month_code : types:: MonthCode ,
174
174
day : u8 ,
175
175
) -> Result < Self :: DateInner , DateError > {
176
- let year_info = self . get_precomputed_data ( ) . load_or_compute_info ( year) ;
176
+ let year = self . get_precomputed_data ( ) . load_or_compute_info ( year) ;
177
177
178
- let Some ( month) = chinese_based_ordinal_lunar_month_from_code ( month_code, year_info ) else {
178
+ let Some ( month) = chinese_based_ordinal_lunar_month_from_code ( month_code, year ) else {
179
179
return Err ( DateError :: UnknownMonthCode ( month_code) ) ;
180
180
} ;
181
181
@@ -184,7 +184,7 @@ impl Calendar for Chinese {
184
184
_ => return Err ( DateError :: UnknownEra ) ,
185
185
}
186
186
187
- Inner :: new_from_ordinals ( year, month, day, year_info )
187
+ Inner :: new_from_ordinals ( year, month, day)
188
188
. map ( ChineseBasedDateInner )
189
189
. map ( ChineseDateInner )
190
190
}
@@ -243,11 +243,17 @@ impl Calendar for Chinese {
243
243
}
244
244
245
245
fn year ( & self , date : & Self :: DateInner ) -> types:: YearInfo {
246
- Self :: format_chinese_year ( date. 0 . 0 . year , Some ( date. 0 . 0 . year_info ) )
246
+ let year = date. 0 . 0 . year ;
247
+ let cyclic = ( year. value - 1 ) . rem_euclid ( 60 ) as u8 ;
248
+ let cyclic = NonZeroU8 :: new ( cyclic + 1 ) . unwrap_or ( NonZeroU8 :: MIN ) ; // 1-indexed
249
+ let rata_die_in_year = date. 0 . 0 . year . new_year :: < ChineseCB > ( ) ;
250
+ let iso_year = Iso :: from_fixed ( rata_die_in_year) . year ( ) ;
251
+ let related_iso = iso_year. era_year_or_extended ( ) ;
252
+ types:: YearInfo :: new_cyclic ( year. value , cyclic, related_iso)
247
253
}
248
254
249
255
fn is_in_leap_year ( & self , date : & Self :: DateInner ) -> bool {
250
- Self :: is_leap_year ( date. 0 . 0 . year , date . 0 . 0 . year_info )
256
+ Self :: provided_year_is_leap ( date. 0 . 0 . year )
251
257
}
252
258
253
259
/// The calendar-specific month code represented by `date`;
@@ -307,11 +313,11 @@ impl<A: AsCalendar<Calendar = Chinese>> Date<A> {
307
313
day : u8 ,
308
314
calendar : A ,
309
315
) -> Result < Date < A > , DateError > {
310
- let year_info = calendar
316
+ let year = calendar
311
317
. as_calendar ( )
312
318
. get_precomputed_data ( )
313
319
. load_or_compute_info ( year) ;
314
- let arithmetic = Inner :: new_from_ordinals ( year, month, day, year_info ) ;
320
+ let arithmetic = Inner :: new_from_ordinals ( year, month, day) ;
315
321
Ok ( Date :: from_raw (
316
322
ChineseDateInner ( ChineseBasedDateInner ( arithmetic?) ) ,
317
323
calendar,
@@ -327,26 +333,6 @@ impl ChineseBasedWithDataLoading for Chinese {
327
333
}
328
334
}
329
335
330
- impl Chinese {
331
- /// Get a YearInfo from an integer Chinese year; optionally, a `ChineseBasedYearInfo`
332
- /// can be passed in for faster results.
333
- fn format_chinese_year (
334
- year : i32 ,
335
- year_info_option : Option < ChineseBasedYearInfo > ,
336
- ) -> types:: YearInfo {
337
- let cyclic = ( year - 1 ) . rem_euclid ( 60 ) as u8 ;
338
- let cyclic = NonZeroU8 :: new ( cyclic + 1 ) . unwrap_or ( NonZeroU8 :: MIN ) ; // 1-indexed
339
- let rata_die_in_year = if let Some ( info) = year_info_option {
340
- info. new_year :: < ChineseCB > ( year)
341
- } else {
342
- Inner :: fixed_mid_year_from_year ( year)
343
- } ;
344
- let iso_year = Iso :: from_fixed ( rata_die_in_year) . year ( ) ;
345
- let related_iso = iso_year. era_year_or_extended ( ) ;
346
- types:: YearInfo :: new_cyclic ( year, cyclic, related_iso)
347
- }
348
- }
349
-
350
336
#[ cfg( test) ]
351
337
mod test {
352
338
use super :: * ;
@@ -474,7 +460,7 @@ mod test {
474
460
let chinese =
475
461
Inner :: chinese_based_date_from_fixed ( chinese. 0 , rata_die, iso. inner . 0 ) ;
476
462
assert_eq ! (
477
- case. expected_year, chinese. 0 . year,
463
+ case. expected_year, chinese. 0 . year. value ,
478
464
"[{calendar_type}] Chinese from fixed failed, case: {case:?}"
479
465
) ;
480
466
assert_eq ! (
@@ -687,7 +673,7 @@ mod test {
687
673
#[ test]
688
674
fn test_month_days ( ) {
689
675
let year = 4660 ;
690
- let year_info =
676
+ let year =
691
677
ChineseBasedPrecomputedData :: < <Chinese as ChineseBasedWithDataLoading >:: CB > :: default ( )
692
678
. load_or_compute_info ( year) ;
693
679
let cases = [
@@ -706,7 +692,7 @@ mod test {
706
692
( 13 , 30 ) ,
707
693
] ;
708
694
for case in cases {
709
- let days_in_month = Chinese :: month_days ( year, case. 0 , year_info ) ;
695
+ let days_in_month = Chinese :: days_in_provided_month ( year, case. 0 ) ;
710
696
assert_eq ! (
711
697
case. 1 , days_in_month,
712
698
"month_days test failed for case: {case:?}"
@@ -840,11 +826,10 @@ mod test {
840
826
841
827
#[ test]
842
828
fn test_month_code_to_ordinal ( ) {
843
- let year = 4660 ;
844
829
// construct using ::default() to force recomputation
845
- let year_info =
830
+ let year =
846
831
ChineseBasedPrecomputedData :: < <Chinese as ChineseBasedWithDataLoading >:: CB > :: default ( )
847
- . load_or_compute_info ( year ) ;
832
+ . load_or_compute_info ( 4660 ) ;
848
833
let codes = [
849
834
( 1 , tinystr ! ( 4 , "M01" ) ) ,
850
835
( 2 , tinystr ! ( 4 , "M02" ) ) ,
@@ -862,11 +847,12 @@ mod test {
862
847
] ;
863
848
for ordinal_code_pair in codes {
864
849
let code = MonthCode ( ordinal_code_pair. 1 ) ;
865
- let ordinal = chinese_based_ordinal_lunar_month_from_code ( code, year_info ) ;
850
+ let ordinal = chinese_based_ordinal_lunar_month_from_code ( code, year ) ;
866
851
assert_eq ! (
867
852
ordinal,
868
853
Some ( ordinal_code_pair. 0 ) ,
869
- "Code to ordinal failed for year: {year}, code: {code}"
854
+ "Code to ordinal failed for year: {}, code: {code}" ,
855
+ year. value
870
856
) ;
871
857
}
872
858
}
@@ -885,18 +871,18 @@ mod test {
885
871
( non_leap_year, tinystr ! ( 4 , "M13" ) ) ,
886
872
( leap_year, tinystr ! ( 4 , "M13" ) ) ,
887
873
] ;
888
- for year_code_pair in invalid_codes {
889
- let year = year_code_pair. 0 ;
874
+ for ( year, code) in invalid_codes {
890
875
// construct using ::default() to force recomputation
891
- let year_info = ChineseBasedPrecomputedData :: <
876
+ let year = ChineseBasedPrecomputedData :: <
892
877
<Chinese as ChineseBasedWithDataLoading >:: CB ,
893
878
> :: default ( )
894
879
. load_or_compute_info ( year) ;
895
- let code = MonthCode ( year_code_pair . 1 ) ;
896
- let ordinal = chinese_based_ordinal_lunar_month_from_code ( code, year_info ) ;
880
+ let code = MonthCode ( code ) ;
881
+ let ordinal = chinese_based_ordinal_lunar_month_from_code ( code, year ) ;
897
882
assert_eq ! (
898
883
ordinal, None ,
899
- "Invalid month code failed for year: {year}, code: {code}"
884
+ "Invalid month code failed for year: {}, code: {code}" ,
885
+ year. value
900
886
) ;
901
887
}
902
888
}
0 commit comments