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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
// SPDX-License-Identifier: AGPL-3.0-or-later
// Copyright (C) 2026 Vallés Puig, Ramon
//! Provider bundle trait for dynamic data look-ups inside observation models.
use crate;
use crateGCRS;
use crateJulianDate;
use Meter;
/// Bundled dynamic data sources consumed by observation model implementations.
///
/// The trait is deliberately minimal and object-safe so that observation models
/// can receive it as `&dyn ProviderBundle`. Concrete implementations are
/// expected to wrap clock-product files, SP3 ephemeris readers, etc.
///
/// Every method has a reasonable default (zero clock bias, `None` state) so
/// that models that do not need a particular service can use
/// [`NullProviderBundle`] or a partial implementation.
///
/// # Examples
///
/// ```
/// use siderust::pod::observation::provider_bundle::{ProviderBundle, NullProviderBundle};
/// use siderust::time::JulianDate;
///
/// fn check(pb: &dyn ProviderBundle) {
/// assert_eq!(pb.receiver_clock_m().value(), 0.0);
/// assert!(pb.gnss_satellite_state_gcrs("G01", JulianDate::new(2_451_545.0)).is_none());
/// }
/// check(&NullProviderBundle);
/// ```
// ─── Null implementation ─────────────────────────────────────────────────────
/// A [`ProviderBundle`] that returns zero biases and no satellite/station
/// states. Useful for unit tests and scenarios where the geometric range
/// is known in advance.
///
/// # Examples
///
/// ```
/// use siderust::pod::observation::provider_bundle::{ProviderBundle, NullProviderBundle};
/// use siderust::time::JulianDate;
///
/// let epoch = JulianDate::new(2_451_545.0);
/// assert_eq!(NullProviderBundle.receiver_clock_m().value(), 0.0);
/// assert!(NullProviderBundle.gnss_satellite_state_gcrs("G05", epoch).is_none());
/// assert_eq!(NullProviderBundle.gnss_satellite_clock_m("G05", epoch).value(), 0.0);
/// assert!(NullProviderBundle.station_gcrs_km("7840", epoch).is_none());
/// ```
;