Skip to main content

oxigeo_qc/
lib.rs

1//! OxiGeo Quality Control and Validation Suite
2//!
3//! This crate provides comprehensive quality control and validation for geospatial data,
4//! including raster and vector data integrity checks, metadata validation, and automatic fixes.
5//!
6//! # Features
7//!
8//! - **Raster Quality Control**: Completeness, consistency, and accuracy checks
9//! - **Vector Quality Control**: Topology validation and attribution checks
10//! - **Metadata Validation**: ISO 19115 and STAC completeness
11//! - **Rules Engine**: Configurable quality rules via TOML
12//! - **Automatic Fixes**: Safe automatic repairs for common issues
13//! - **Reporting**: HTML and JSON report generation
14//!
15//! # Example Usage
16//!
17//! ```rust
18//! use oxigeo_qc::prelude::*;
19//! use oxigeo_core::buffer::RasterBuffer;
20//! use oxigeo_core::types::RasterDataType;
21//!
22//! // Check raster completeness
23//! let buffer = RasterBuffer::zeros(1000, 1000, RasterDataType::Float32);
24//! let checker = CompletenessChecker::new();
25//! let result = checker.check_buffer(&buffer)?;
26//!
27//! println!("Valid pixels: {}/{}", result.valid_pixels, result.total_pixels);
28//! # Ok::<(), oxigeo_qc::error::QcError>(())
29//! ```
30//!
31//! # Module Organization
32//!
33//! - [`error`] - Error types and severity levels
34//! - [`raster`] - Raster quality control checks
35//! - [`vector`] - Vector quality control checks
36//! - [`metadata`] - Metadata validation
37//! - [`report`] - Report generation
38//! - [`rules`] - Quality rules engine
39//! - [`fix`] - Automatic fixes
40
41#![warn(missing_docs)]
42#![warn(clippy::all)]
43// Pedantic disabled to reduce noise - default clippy::all is sufficient
44// #![warn(clippy::pedantic)]
45#![deny(clippy::unwrap_used)]
46#![deny(clippy::panic)]
47#![allow(clippy::module_name_repetitions)]
48#![allow(clippy::missing_errors_doc)]
49#![allow(clippy::missing_panics_doc)]
50
51pub mod batch;
52pub mod error;
53pub mod fix;
54pub mod gpkg;
55pub mod metadata;
56pub mod raster;
57pub mod report;
58pub mod rules;
59pub mod stac;
60pub mod vector;
61
62pub use batch::{BatchConfig, BatchReport, BatchRunner, FileQcResult, SeverityCounts};
63pub use gpkg::{GpkgValidationResult, GpkgValidator};
64pub use stac::{StacValidationResult, StacValidator};
65
66/// Prelude module for convenient imports.
67pub mod prelude {
68    /// Convenient re-exports of commonly used types and traits.
69    pub use crate::error::{QcError, QcIssue, QcResult, Severity};
70    pub use crate::fix::{FixResult, FixStrategy, TopologyFixer};
71    pub use crate::metadata::{MetadataChecker, MetadataConfig, MetadataResult, MetadataStandard};
72    pub use crate::raster::{
73        AccuracyChecker, AccuracyConfig, AccuracyResult, BandRadiometricResult, BandRange,
74        CogComplianceChecker, CogComplianceResult, CompletenessChecker, CompletenessConfig,
75        CompletenessResult, ConsistencyChecker, ConsistencyConfig, ConsistencyResult,
76        CrsAndExtentValidator, CrsExtentValidationResult, NoDataBandStats, NoDataValidationResult,
77        NoDataValidator, RadiometricValidationResult, RadiometricValidator, SensorProfile,
78        StrictMode,
79    };
80    pub use crate::report::{QualityAssessment, QualityReport, ReportSection};
81    pub use crate::rules::{
82        ComparisonOperator, QcValue, QualityRule, RuleBuilder, RuleCategory, RuleSet, RulesEngine,
83    };
84    pub use crate::vector::{
85        AttributionChecker, AttributionConfig, AttributionResult, TopologyChecker, TopologyConfig,
86        TopologyOptions, TopologyResult, TopologyViolation, check_topology_rules,
87        has_self_intersection,
88    };
89}
90
91/// Crate version
92pub const VERSION: &str = env!("CARGO_PKG_VERSION");
93
94/// Crate name
95pub const NAME: &str = env!("CARGO_PKG_NAME");
96
97#[cfg(test)]
98mod tests {
99    use super::*;
100
101    #[test]
102    fn test_version() {
103        assert!(!VERSION.is_empty());
104        assert_eq!(NAME, "oxigeo-qc");
105    }
106
107    #[test]
108    fn test_prelude_imports() {
109        use prelude::*;
110
111        // Test that common types are accessible
112        let _severity = Severity::Major;
113        let _assessment = QualityAssessment::Good;
114        let _strategy = FixStrategy::Conservative;
115    }
116}