use geo_traits::GeometryTrait;
use crate::{Result, Value};
use super::feature_writer::FeatureWriter;
#[derive(Debug, Clone)]
pub struct NewFeature<G> {
pub fid: Option<i64>,
pub geometry: Option<G>,
pub values: Vec<Value>,
}
impl<G> NewFeature<G> {
pub fn new(geometry: G, values: Vec<Value>) -> Self {
Self {
fid: None,
geometry: Some(geometry),
values,
}
}
pub fn attributes(values: Vec<Value>) -> Self {
Self {
fid: None,
geometry: None,
values,
}
}
#[must_use]
pub fn with_fid(mut self, fid: i64) -> Self {
self.fid = Some(fid);
self
}
}
pub(crate) trait WritableRow {
fn write(self, writer: &mut FeatureWriter<'_>) -> Result<(i64, Option<[f64; 4]>)>;
}
impl<G: GeometryTrait<T = f64>> WritableRow for NewFeature<G> {
fn write(self, writer: &mut FeatureWriter<'_>) -> Result<(i64, Option<[f64; 4]>)> {
match &self.geometry {
Some(geometry) => writer.insert_returning_envelope(self.fid, geometry, &self.values),
None => writer
.insert_row_owned(self.fid, &self.values)
.map(|fid| (fid, None)),
}
}
}