#![forbid(unsafe_code)]
pub mod batch_helmert;
pub mod conversions;
mod internal;
pub mod transformations;
use oxiproj_core::{Ellipsoid, IoUnits, Operation, ProjError, ProjResult};
pub use oxiproj_core::GridRegistry;
pub use transformations::helmert_batch;
pub mod epoch_transform;
pub use epoch_transform::{epoch_path, plate_for_frame, propagate_epoch};
pub mod covariance;
pub use covariance::{
propagate_through_affine_2d, propagate_through_helmert_3, propagate_through_helmert_7_xy,
};
pub mod frame_chain;
pub use frame_chain::{
apply_frame_transform, find_frame_transform, FrameTransform, FRAME_TRANSFORMS,
};
pub mod epoch_pipeline;
pub use epoch_pipeline::{transform_epoch_aware, EpochAwareResult};
pub trait TransParamLookup {
fn get_dms(&self, key: &str) -> Option<f64>;
fn get_f64(&self, key: &str) -> Option<f64>;
fn get_int(&self, key: &str) -> Option<i64>;
fn get_str(&self, key: &str) -> Option<&str>;
fn get_bool(&self, key: &str) -> bool;
fn exists(&self, key: &str) -> bool;
}
pub struct TransParams<'a> {
pub ellipsoid: &'a Ellipsoid,
pub params: &'a dyn TransParamLookup,
pub registry: Option<&'a dyn GridRegistry>,
}
pub struct TransBuild {
pub operation: Box<dyn Operation>,
pub left: IoUnits,
pub right: IoUnits,
}
impl TransBuild {
pub fn new(operation: Box<dyn Operation>, left: IoUnits, right: IoUnits) -> TransBuild {
TransBuild {
operation,
left,
right,
}
}
}
pub fn build(name: &str, p: &TransParams) -> ProjResult<TransBuild> {
conversions::build(name, p)
.or_else(|| transformations::build(name, p))
.unwrap_or(Err(ProjError::InvalidOp))
}
#[cfg(test)]
mod tests {
use super::*;
use oxiproj_core::Ellipsoid;
struct NoParams;
impl TransParamLookup for NoParams {
fn get_dms(&self, _key: &str) -> Option<f64> {
None
}
fn get_f64(&self, _key: &str) -> Option<f64> {
None
}
fn get_int(&self, _key: &str) -> Option<i64> {
None
}
fn get_str(&self, _key: &str) -> Option<&str> {
None
}
fn get_bool(&self, _key: &str) -> bool {
false
}
fn exists(&self, _key: &str) -> bool {
false
}
}
fn wgs84() -> Ellipsoid {
Ellipsoid::named("WGS84").unwrap()
}
#[test]
fn build_noop_succeeds() {
let ell = wgs84();
let np = NoParams;
let pp = TransParams {
ellipsoid: &ell,
params: &np,
registry: None,
};
assert!(build("noop", &pp).is_ok());
}
#[test]
fn build_unknown_is_invalid_op() {
let ell = wgs84();
let np = NoParams;
let pp = TransParams {
ellipsoid: &ell,
params: &np,
registry: None,
};
assert_eq!(build("nonexistent", &pp).err(), Some(ProjError::InvalidOp));
}
}