use crate::context_handle::with_context;
use crate::functions::{errcheck, nullcheck};
use crate::traits::as_raw_mut_impl;
use crate::{AsRaw, AsRawMut, GResult, MakeValidMethod};
use geos_sys::*;
use std::ptr::NonNull;
pub struct MakeValidParams {
ptr: NonNull<GEOSMakeValidParams>,
}
#[derive(Default)]
pub struct MakeValidParamsBuilder {
method: Option<MakeValidMethod>,
keep_collapsed: Option<bool>,
}
impl MakeValidParams {
pub fn new() -> GResult<Self> {
with_context(|ctx| unsafe {
let ptr = nullcheck!(GEOSMakeValidParams_create_r(ctx.as_raw()))?;
Ok(Self { ptr })
})
}
pub fn builder() -> MakeValidParamsBuilder {
MakeValidParamsBuilder::default()
}
pub fn set_method(&mut self, method: MakeValidMethod) -> GResult<()> {
with_context(|ctx| unsafe {
errcheck!(GEOSMakeValidParams_setMethod_r(
ctx.as_raw(),
self.as_raw_mut_override(),
method.into(),
))?;
Ok(())
})
}
pub fn set_keep_collapsed(&mut self, keep_collapsed: bool) -> GResult<()> {
with_context(|ctx| unsafe {
errcheck!(GEOSMakeValidParams_setKeepCollapsed_r(
ctx.as_raw(),
self.as_raw_mut_override(),
keep_collapsed.into(),
))?;
Ok(())
})
}
}
unsafe impl Send for MakeValidParams {}
unsafe impl Sync for MakeValidParams {}
impl Drop for MakeValidParams {
fn drop(&mut self) {
with_context(|ctx| unsafe {
GEOSMakeValidParams_destroy_r(ctx.as_raw(), self.as_raw_mut());
});
}
}
as_raw_mut_impl!(MakeValidParams, GEOSMakeValidParams);
impl MakeValidParamsBuilder {
pub const fn method(mut self, method: MakeValidMethod) -> Self {
self.method = Some(method);
self
}
pub const fn keep_collapsed(mut self, keep_collapsed: bool) -> Self {
self.keep_collapsed = Some(keep_collapsed);
self
}
pub fn build(self) -> GResult<MakeValidParams> {
let mut params = MakeValidParams::new()?;
if let Some(method) = self.method {
params.set_method(method)?;
}
if let Some(keep_collapsed) = self.keep_collapsed {
params.set_keep_collapsed(keep_collapsed)?;
}
Ok(params)
}
}