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
// SPDX-License-Identifier: AGPL-3.0-or-later
// Copyright (C) 2026 Vallés Puig, Ramon
//! Astronomical target representation
//!
//! This module defines two complementary concepts:
//!
//! ## [`CoordinateWithPM`] — Coordinate Sample
//!
//! A lightweight container that couples a position with the time at which
//! the position was recorded, together with an optional proper-motion model.
//! It is deliberately generic over the coordinate type so it can be reused
//! with Cartesian/Spherical equatorial/ecliptic/ICRS positions.
//!
//! **What it is:** a stamped coordinate snapshot — a measurement or catalog
//! entry, not an astronomical object.
//!
//! The design goals are:
//! * **Zero-cost abstraction** – All helper constructors are `const`, allowing
//! compile-time evaluation when all arguments are known at build time.
//! * **Flexibility** – The generic parameter `T` lets client code choose any
//! position type that implements the required operations.
//! * **Clarity** – Specific helpers (`new`, `new_static`, `new_raw`) make the
//! author's intent explicit: moving target, fixed target, or advanced manual
//! construction respectively.
//!
//! A backward-compatible type alias `Target<T>` is available so that existing
//! code continues to compile. New code should prefer `CoordinateWithPM<T>`.
//!
//! ## [`Trackable`] — Object Abstraction
//!
//! A trait representing "anything that can produce coordinates at time *t*":
//!
//! ```rust,ignore
//! pub trait Trackable {
//! type Coords;
//! fn track(&self, jd: JulianDate) -> Self::Coords;
//! }
//! ```
//!
//! Implemented for solar-system unit types, `Star`, `direction::ICRS`,
//! and `CoordinateWithPM<T>` (identity).
//!
//! ## Examples
//! ```rust
//! use qtty::*;
//! use siderust::targets::CoordinateWithPM;
//! use siderust::time::ModifiedJulianDate;
//! use siderust::coordinates::frames::EquatorialMeanJ2000;
//! use siderust::coordinates::spherical::Direction;
//! use siderust::astro::proper_motion::ProperMotion;
//!
//! // A star with known proper motion
//! type MasPerYear = qtty::Per<qtty::MilliArcsecond, qtty::Year>;
//! type MasPerYearQ = qtty::Quantity<MasPerYear>;
//! let betelgeuse_pm = ProperMotion::from_mu_alpha_star::<MasPerYear>(
//! MasPerYearQ::new(27.54),
//! MasPerYearQ::new(10.86),
//! );
//! let betelgeuse = CoordinateWithPM::new(
//! Direction::<EquatorialMeanJ2000>::new(88.792939*DEG, 7.407064*DEG),
//! ModifiedJulianDate::new(60200.0).into(),
//! betelgeuse_pm,
//! );
//!
//! // Jupiter's geocentric position at a given epoch (no proper motion)
//! let jupiter = CoordinateWithPM::new_static(
//! Direction::<EquatorialMeanJ2000>::new(23.123*DEG, -5.321*DEG),
//! ModifiedJulianDate::new(60200.0).into(),
//! );
//! ```
pub use ;
pub use Trackable;