Skip to main content

high_latitude/
high-latitude.rs

1use chrono::{DateTime, NaiveDate, Utc};
2use mawaqit::prelude::*;
3
4fn times_at(lat: f64, label: &str, date: NaiveDate, original_coords: Coordinates) {
5    let params = Configuration::new(18.0, 17.0)
6        .method(Method::MuslimWorldLeague)
7        .madhab(Madhab::Shafi)
8        .done();
9
10    let ref_coords = Coordinates::new(lat, original_coords.longitude);
11    match PrayerTimes::try_new(date, ref_coords, params) {
12        Ok(t) => println!(
13            "{label:>12} ({lat:.2}°): {:?} {:?} {:?} {:?} {:?} {:?}",
14            t.time(Prayer::Fajr),
15            t.time(Prayer::Sunrise),
16            t.time(Prayer::Dhuhr),
17            t.time(Prayer::Asr),
18            t.time(Prayer::Maghrib),
19            t.time(Prayer::Isha),
20        ),
21        Err(e) => println!("{label:>12} ({lat:.2}°): FAIL ({e})"),
22    }
23}
24
25fn main() {
26    let date = NaiveDate::from_ymd_opt(2026, 7, 5).expect("valid date");
27    let dt: DateTime<Utc> = date.and_hms_opt(0, 0, 0).unwrap().and_utc();
28    let tromso = Coordinates::new(70.0, 20.0);
29
30    // 1. Original 70°N — no fallback
31    times_at(70.0, "Original 70°", date, tromso);
32
33    // 2. NearestLatitude (resolved)
34    let resolved = PolarFallback::NearestLatitude
35        .resolve_latitude(dt, tromso, Madhab::Shafi)
36        .unwrap();
37    times_at(resolved, "NearestLat", date, tromso);
38    println!("  → Resolved latitude: {resolved:.6}°");
39
40    // 3. Reference45 (fixed 45°N)
41    times_at(45.0, "Reference45", date, tromso);
42
43    // 4. Also show at a clean mid-latitude
44    times_at(48.0, "48° fixed", date, tromso);
45
46    // Now show NearestLatitude via the proper API
47    let params = Configuration::new(18.0, 17.0)
48        .method(Method::MuslimWorldLeague)
49        .madhab(Madhab::Shafi)
50        .polar_fallback(PolarFallback::NearestLatitude)
51        .done();
52    let t = PrayerTimes::try_new(date, tromso, params).unwrap();
53    println!("\nNearestLatitude via API:");
54    println!(
55        "  {:?} {:?} {:?} {:?} {:?} {:?}",
56        t.time(Prayer::Fajr),
57        t.time(Prayer::Sunrise),
58        t.time(Prayer::Dhuhr),
59        t.time(Prayer::Asr),
60        t.time(Prayer::Maghrib),
61        t.time(Prayer::Isha),
62    );
63
64    // Also for Jan 15 (winter)
65    let winter = NaiveDate::from_ymd_opt(2026, 1, 15).expect("valid date");
66    let wt: DateTime<Utc> = winter.and_hms_opt(0, 0, 0).unwrap().and_utc();
67    println!("\n--- Winter (Jan 15) ---");
68    times_at(70.0, "Original 70°", winter, tromso);
69
70    let winter_resolved = PolarFallback::NearestLatitude
71        .resolve_latitude(wt, tromso, Madhab::Shafi)
72        .unwrap();
73    times_at(winter_resolved, "NearestLat", winter, tromso);
74    println!("  → Resolved latitude: {winter_resolved:.6}°");
75    times_at(45.0, "Reference45", winter, tromso);
76
77    let t2 = PrayerTimes::try_new(winter, tromso, params).unwrap();
78    println!("\nWinter NearestLatitude via API:");
79    println!(
80        "  {:?} {:?} {:?} {:?} {:?} {:?}",
81        t2.time(Prayer::Fajr),
82        t2.time(Prayer::Sunrise),
83        t2.time(Prayer::Dhuhr),
84        t2.time(Prayer::Asr),
85        t2.time(Prayer::Maghrib),
86        t2.time(Prayer::Isha),
87    );
88}