diff options
Diffstat (limited to 'hittekaart-py')
| -rw-r--r-- | hittekaart-py/src/lib.rs | 24 | 
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>,  | 
