aboutsummaryrefslogtreecommitdiff
path: root/hittekaart-py/src
diff options
context:
space:
mode:
Diffstat (limited to 'hittekaart-py/src')
-rw-r--r--hittekaart-py/src/lib.rs24
1 files changed, 24 insertions, 0 deletions
diff --git a/hittekaart-py/src/lib.rs b/hittekaart-py/src/lib.rs
index 2ad0e56..782f9e7 100644
--- a/hittekaart-py/src/lib.rs
+++ b/hittekaart-py/src/lib.rs
@@ -1,3 +1,6 @@
+//! Python bindings for hittekaart.
+//!
+//! This module provides simple-to-use bindings for hittekaart generation from Python scripts.
use hittekaart::gpx::{self, Compression, Coordinates};
use hittekaart::renderer::{self, Renderer};
use pyo3::create_exception;
@@ -11,6 +14,11 @@ use std::path::PathBuf;
create_exception!(hittekaart_py, HitteError, pyo3::exceptions::PyException);
+/// Converts an error to a Python error.
+///
+/// This basically maps everything to [`HitteError`] and provides a stringified error explanation.
+///
+/// This recursively uses `::source()` to walk the chain.
fn err_to_py(mut error: &dyn Error) -> PyErr {
let mut text = error.to_string();
loop {
@@ -23,6 +31,7 @@ fn err_to_py(mut error: &dyn Error) -> PyErr {
HitteError::new_err(text)
}
+/// Python representation of a track.
#[pyclass]
#[derive(Debug, Clone)]
struct Track {
@@ -31,6 +40,9 @@ struct Track {
#[pymethods]
impl Track {
+ /// Load a track from a file.
+ ///
+ /// Compression - if given - should be one of the strings "gzip" or "brotli".
#[staticmethod]
fn from_file(path: &[u8], compression: Option<&str>) -> PyResult<Track> {
let compression = match compression {
@@ -44,6 +56,7 @@ impl Track {
Ok(Track { inner: track })
}
+ /// Load a track from the given coordinates.
#[staticmethod]
fn from_coordinates(coordinates: Vec<(f64, f64)>) -> Track {
Track {
@@ -53,7 +66,9 @@ impl Track {
.collect(),
}
}
+}
+impl Track {
fn coordinates(&self) -> Vec<(f64, f64)> {
self.inner
.iter()
@@ -68,12 +83,14 @@ enum StorageType {
Sqlite(PathBuf),
}
+/// Python representation of a storage target.
#[pyclass]
#[derive(Debug, Clone, PartialEq, Eq)]
struct Storage(StorageType);
#[pymethods]
impl Storage {
+ /// Output to the given folder.
#[staticmethod]
#[pyo3(name = "Folder")]
fn folder(path: &[u8]) -> Self {
@@ -81,6 +98,7 @@ impl Storage {
Storage(StorageType::Folder(path.into()))
}
+ /// Output to the given sqlite file.
#[staticmethod]
#[pyo3(name = "Sqlite")]
fn sqlite(path: &[u8]) -> Self {
@@ -105,6 +123,7 @@ impl Storage {
}
}
+/// Python representation of a heatmap renderer.
#[pyclass]
struct HeatmapRenderer {
inner: renderer::heatmap::Renderer,
@@ -120,6 +139,11 @@ impl HeatmapRenderer {
}
}
+/// Generate the heatmap.
+///
+/// * `items` is an iterable of [`Track`]s
+/// * `renderer` should be a renderer (like [`HeatmapRenderer`])
+/// * `storage` is the [`Storage`] output
#[pyfunction]
fn generate(
items: &Bound<'_, PyAny>,