use crate::error::Result;
use crate::shp::reader::ShapeRecord;
use crate::{ColumnValue, FeatureProperties, PropertyProcessor};
use dbase::FieldValue;
impl FeatureProperties for ShapeRecord {
fn process_properties<P: PropertyProcessor>(&self, processor: &mut P) -> Result<bool> {
let mut i = 0;
for (name, value) in self.record.as_ref().iter() {
let finish = match value {
FieldValue::Character(Some(val)) => {
processor.property(i, name, &ColumnValue::String(val))?
}
FieldValue::Numeric(Some(val)) => {
processor.property(i, name, &ColumnValue::Double(*val))?
}
FieldValue::Logical(Some(val)) => {
processor.property(i, name, &ColumnValue::Bool(*val))?
}
FieldValue::Date(Some(_)) => {
let s = value.to_string();
processor.property(i, name, &ColumnValue::DateTime(&s))?
}
FieldValue::Float(Some(val)) => {
processor.property(i, name, &ColumnValue::Float(*val))?
}
FieldValue::Integer(val) => processor.property(i, name, &ColumnValue::Int(*val))?,
FieldValue::Double(val) => {
processor.property(i, name, &ColumnValue::Double(*val))?
}
FieldValue::Currency(val) => {
processor.property(i, name, &ColumnValue::Double(*val))?
}
FieldValue::DateTime(_) => {
let s = value.to_string();
processor.property(i, name, &ColumnValue::DateTime(&s))?
}
FieldValue::Memo(val) => processor.property(i, name, &ColumnValue::String(val))?,
FieldValue::Character(None)
| FieldValue::Numeric(None)
| FieldValue::Logical(None)
| FieldValue::Date(None)
| FieldValue::Float(None) => {
continue; }
};
if finish {
return Ok(true);
}
i += 1;
}
Ok(false)
}
}