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
use crate::prelude::tz::TimeZone;
use crate::prelude::Zmanim;
use chrono::prelude::*;

pub mod prelude;

#[must_use]
pub fn get(
    zmanim: &Zmanim,
    latitude: f64,
    longitude: f64,
    date: NaiveDate,
    time_zone: &TimeZone,
) -> Option<DateTime<FixedOffset>> {
    let (sunrise, sunset) =
        sunrise::sunrise_sunset(latitude, longitude, date.year(), date.month(), date.day());
    let naive_sunrise = NaiveDateTime::from_timestamp_opt(sunrise, 0)?;
    let naive_sunset = NaiveDateTime::from_timestamp_opt(sunset, 0)?;
    let fixed_offset_sunrise = time_zone.get_tz(&naive_sunrise);
    let fixed_offset_sunset = time_zone.get_tz(&naive_sunset);
    let sunrise = DateTime::<FixedOffset>::from_utc(naive_sunrise, fixed_offset_sunrise);
    let sunset = DateTime::<FixedOffset>::from_utc(naive_sunset, fixed_offset_sunset);
    Some(match zmanim {
        Zmanim::Sunrise => sunrise,
        Zmanim::Sunset => sunset,
        _ => unreachable!(),
    })
}