- 
                Notifications
    
You must be signed in to change notification settings  - Fork 594
 
          Deprecate panicking constructors of TimeDelta
          #1450
        
          New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
          Codecov ReportAll modified and coverable lines are covered by tests ✅ 
 Additional details and impacted files@@            Coverage Diff             @@
##             main    #1450      +/-   ##
==========================================
+ Coverage   91.95%   92.03%   +0.07%     
==========================================
  Files          40       40              
  Lines       18035    18163     +128     
==========================================
+ Hits        16584    16716     +132     
+ Misses       1451     1447       -4     ☔ View full report in Codecov by Sentry.  | 
    
578771b    to
    cf8765e      
    Compare
  
    TimeDelta for deprecating panicking constructorsTimeDelta
      cf8765e    to
    006d58d      
    Compare
  
            
          
                src/naive/date/mod.rs
              
                Outdated
          
        
      | let cycle2 = yo_to_cycle(year2_mod_400 as u32, rhs.ordinal()) as i64; | ||
| TimeDelta::days((year1_div_400 as i64 - year2_div_400 as i64) * 146_097 + (cycle1 - cycle2)) | ||
| let days = (year1_div_400 as i64 - year2_div_400 as i64) * 146_097 + (cycle1 - cycle2); | ||
| expect!(TimeDelta::try_days(days), "range of NaiveDate is MUCH less than TimeDelta") | 
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This error message is a bit too opinionated for my taste, can we just say it is out of range?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It is const but otherwise functionally the same as
TimeDelta::try_days(days).unwrap() // range of NaiveDate is MUCH less than TimeDeltaThe doc comment a little above says:
    /// This does not overflow or underflow at all,
    /// as all possible output fits in the range of `TimeDelta`.
The range of TimeDelta is ca. 585 million years, the range of NaiveDate ca. 525.000 years.
I can change it to "always in range".
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That works for me.
        
          
                src/naive/datetime/mod.rs
              
                Outdated
          
        
      | 
               | 
          ||
| let date = try_opt!(self.date.checked_add_signed(TimeDelta::seconds(rhs))); | ||
| let (time, rhs_days) = self.time.overflowing_add_signed(rhs); | ||
| let rhs_days = try_opt!(TimeDelta::try_seconds(rhs_days)); | 
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It seems pretty confusing to pass something called rhs_days to try_seconds().
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I suppose remainder is less confusing.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sounds good.
| let maximum = "2262-04-11T23:47:16.854775804UTC"; | ||
| let parsed: DateTime<Utc> = maximum.parse().unwrap(); | ||
| let beyond_max = parsed + TimeDelta::days(365); | ||
| let beyond_max = parsed + Days::new(365); | 
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm, maybe we should resurrect your work on CalendarDuration?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'd like to. Part 1 is ready for review 😄. Maybe wait a few more weeks until we are good underway with the Result stuff?
        
          
                src/time_delta.rs
              
                Outdated
          
        
      | #[must_use] | ||
| #[deprecated( | ||
| since = "0.4.35", | ||
| note = "Use `TimeDelta::try_weeks` instead or consider the `Days` type" | 
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So I don't really want to recommend the Days type here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Okay, I'll remove it.
006d58d    to
    6a1be47      
    Compare
  
            
          
                src/naive/datetime/mod.rs
              
                Outdated
          
        
      | } | ||
| 
               | 
          ||
| let date = try_opt!(self.date.checked_add_signed(TimeDelta::seconds(rhs))); | ||
| let (time, rhs_days) = self.time.overflowing_add_signed(rhs); | 
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
rhs_days -> remainder here as well?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oops, stupid!
6a1be47    to
    563c53d      
    Compare
  
    
This PR touches a lot of lines, but I would only call the first 5 commits and the last one interesting.
TimeDelta::daysandTimeDelta::weekswith theDaystype, which should be a little faster and conceptually a better match.NaiveDateTime::{checked_add_signed, checked_sub_signed}we could remove a workaround now that we havetry_seconds.Parsed::to_naive_dateI factored out the logic to calculate a date from a week starting on Monday or Sunday toresolve_week_date. And instead of calculating aTimeDeltawith the number of days to add to January 1 we just calculate the ordinal directly and set the ordinal.try_variant.Fixes #1408.