use crate::{ObjectId, SessionId};
use derive_getters::Getters;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Getters)]
#[serde(rename_all = "camelCase")]
pub struct EditResult {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
add_results: Vec<EditResultItem>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
update_results: Vec<EditResultItem>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
delete_results: Vec<EditResultItem>,
}
impl EditResult {
pub fn all_succeeded(&self) -> bool {
let all_adds = self.add_results.iter().all(|r| r.success);
let all_updates = self.update_results.iter().all(|r| r.success);
let all_deletes = self.delete_results.iter().all(|r| r.success);
all_adds && all_updates && all_deletes
}
pub fn success_count(&self) -> usize {
self.add_results.iter().filter(|r| r.success).count()
+ self.update_results.iter().filter(|r| r.success).count()
+ self.delete_results.iter().filter(|r| r.success).count()
}
pub fn failure_count(&self) -> usize {
self.add_results.iter().filter(|r| !r.success).count()
+ self.update_results.iter().filter(|r| !r.success).count()
+ self.delete_results.iter().filter(|r| !r.success).count()
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Getters)]
#[serde(rename_all = "camelCase")]
pub struct EditResultItem {
#[serde(skip_serializing_if = "Option::is_none")]
object_id: Option<ObjectId>,
#[serde(skip_serializing_if = "Option::is_none")]
global_id: Option<String>,
success: bool,
#[serde(skip_serializing_if = "Option::is_none")]
error: Option<EditError>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Getters)]
pub struct EditError {
code: i32,
description: String,
#[serde(rename = "fieldName", skip_serializing_if = "Option::is_none")]
field_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
values: Option<Vec<serde_json::Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
details: Option<Vec<String>>,
}
impl std::fmt::Display for EditError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
if let Some(ref field_name) = self.field_name {
write!(
f,
"Edit error {} (field: {}): {}",
self.code, field_name, self.description
)
} else {
write!(f, "Edit error {}: {}", self.code, self.description)
}
}
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct EditOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub gdb_version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub rollback_on_failure: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub use_global_ids: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub return_edit_results: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub session_id: Option<SessionId>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Getters)]
#[serde(rename_all = "camelCase")]
pub struct CalculateResult {
success: bool,
#[serde(default)]
updated_feature_count: Option<i64>,
#[serde(default)]
edit_moment: Option<i64>,
}
impl Default for EditOptions {
fn default() -> Self {
Self {
gdb_version: None,
rollback_on_failure: Some(true),
use_global_ids: None,
return_edit_results: Some(true),
session_id: None,
}
}
}
impl EditOptions {
pub fn new() -> Self {
Self::default()
}
pub fn with_gdb_version(mut self, version: impl Into<String>) -> Self {
self.gdb_version = Some(version.into());
self
}
pub fn with_rollback_on_failure(mut self, rollback: bool) -> Self {
self.rollback_on_failure = Some(rollback);
self
}
pub fn with_use_global_ids(mut self, use_global_ids: bool) -> Self {
self.use_global_ids = Some(use_global_ids);
self
}
pub fn with_return_edit_results(mut self, return_results: bool) -> Self {
self.return_edit_results = Some(return_results);
self
}
pub fn with_session_id(mut self, session_id: SessionId) -> Self {
self.session_id = Some(session_id);
self
}
}