lwgeom 0.0.5

Rust bindings for the PostGIS LWGEOM geometry library.
Documentation
use core::ffi::CStr;

use lwgeom_sys::*;

use crate::{LWGeom, LWGeomError, Result};

pub(crate) struct LWGeomParserResult {
    inner: *mut LWGEOM_PARSER_RESULT,
}

impl LWGeomParserResult {
    pub fn new() -> Result<Self> {
        let boxed_result = Box::new(unsafe { std::mem::zeroed::<LWGEOM_PARSER_RESULT>() });
        let inner = Box::into_raw(boxed_result);
        unsafe { lwgeom_parser_result_init(inner) }
        Ok(Self { inner })
    }

    pub fn inner_ptr(&self) -> *mut LWGEOM_PARSER_RESULT {
        self.inner
    }

    fn inner_ref(&self) -> Result<&LWGEOM_PARSER_RESULT> {
        unsafe { self.inner.as_ref() }.ok_or(LWGeomError::NullPtrError)
    }

    pub fn geom(&self) -> Result<LWGeom> {
        LWGeom::new_from_raw(self.inner_ref()?.geom)
    }

    pub fn message(&self) -> Result<String> {
        Ok(unsafe { CStr::from_ptr(self.inner_ref()?.message) }
            .to_string_lossy()
            .to_string())
    }
}

unsafe impl Send for LWGeomParserResult {}
unsafe impl Sync for LWGeomParserResult {}

// impl Drop for LWGeomParserResult {
//     fn drop(&mut self) {
//         unsafe { lwgeom_parser_result_free(self.inner_ptr()) }
//     }
// }