use crate::ArcGISGeometry;
use derive_getters::Getters;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, derive_builder::Builder, Getters)]
#[builder(setter(into, strip_option))]
#[serde(rename_all = "camelCase")]
pub struct ProjectParameters {
#[serde(serialize_with = "serialize_geometries")]
geometries: Vec<ArcGISGeometry>,
in_sr: i32,
out_sr: i32,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default)]
transformation: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default)]
transform_forward: Option<bool>,
}
impl ProjectParameters {
pub fn builder() -> ProjectParametersBuilder {
ProjectParametersBuilder::default()
}
}
fn serialize_geometries<S>(geoms: &[ArcGISGeometry], serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
use serde::ser::SerializeStruct;
let geometry_type = match geoms.first() {
Some(ArcGISGeometry::Point(_)) => "esriGeometryPoint",
Some(ArcGISGeometry::Multipoint(_)) => "esriGeometryMultipoint",
Some(ArcGISGeometry::Polyline(_)) => "esriGeometryPolyline",
Some(ArcGISGeometry::Polygon(_)) => "esriGeometryPolygon",
Some(ArcGISGeometry::Envelope(_)) => "esriGeometryEnvelope",
None => {
use serde::ser::SerializeSeq;
let seq = serializer.serialize_seq(Some(0))?;
return seq.end();
}
};
let mut state = serializer.serialize_struct("GeometriesWrapper", 2)?;
state.serialize_field("geometryType", geometry_type)?;
state.serialize_field("geometries", geoms)?;
state.end()
}
fn serialize_plain_polygons<S>(geoms: &[ArcGISGeometry], serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
use serde::ser::SerializeSeq;
let mut seq = serializer.serialize_seq(Some(geoms.len()))?;
for geom in geoms {
match geom {
ArcGISGeometry::Polygon(polygon) => {
seq.serialize_element(polygon)?;
}
_ => {
return Err(serde::ser::Error::custom(
"areasAndLengths only accepts Polygon geometries",
));
}
}
}
seq.end()
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Getters)]
pub struct ProjectResult {
geometries: Vec<ArcGISGeometry>,
}
#[derive(Debug, Clone, Serialize, derive_builder::Builder, Getters)]
#[builder(setter(into, strip_option))]
#[serde(rename_all = "camelCase")]
pub struct BufferParameters {
#[serde(serialize_with = "serialize_geometries")]
geometries: Vec<ArcGISGeometry>,
in_sr: i32,
distances: Vec<f64>,
unit: LinearUnit,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default)]
union_results: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default)]
geodesic: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default)]
out_sr: Option<i32>,
}
impl BufferParameters {
pub fn builder() -> BufferParametersBuilder {
BufferParametersBuilder::default()
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Getters)]
pub struct BufferResult {
geometries: Vec<ArcGISGeometry>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum LinearUnit {
#[serde(rename = "esriMeters")]
Meters,
#[serde(rename = "esriKilometers")]
Kilometers,
#[serde(rename = "esriFeet")]
Feet,
#[serde(rename = "esriMiles")]
Miles,
#[serde(rename = "esriNauticalMiles")]
NauticalMiles,
#[serde(rename = "esriYards")]
Yards,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Getters)]
#[serde(rename_all = "camelCase")]
pub struct Transformation {
wkid: i32,
#[serde(skip_serializing_if = "Option::is_none")]
wkt: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
name: Option<String>,
}
#[derive(Debug, Clone, Serialize, derive_builder::Builder, Getters)]
#[builder(setter(into, strip_option))]
#[serde(rename_all = "camelCase")]
pub struct SimplifyParameters {
#[serde(serialize_with = "serialize_geometries")]
geometries: Vec<ArcGISGeometry>,
sr: i32,
}
impl SimplifyParameters {
pub fn builder() -> SimplifyParametersBuilder {
SimplifyParametersBuilder::default()
}
}
fn deserialize_plain_polygons<'de, D>(deserializer: D) -> Result<Vec<ArcGISGeometry>, D::Error>
where
D: serde::Deserializer<'de>,
{
use serde::Deserialize;
let polygons: Vec<crate::ArcGISPolygon> = Vec::deserialize(deserializer)?;
Ok(polygons.into_iter().map(ArcGISGeometry::Polygon).collect())
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Getters)]
pub struct SimplifyResult {
#[serde(deserialize_with = "deserialize_plain_polygons")]
geometries: Vec<ArcGISGeometry>,
}
#[derive(Debug, Clone, Serialize, derive_builder::Builder, Getters)]
#[builder(setter(into, strip_option))]
#[serde(rename_all = "camelCase")]
pub struct UnionParameters {
#[serde(serialize_with = "serialize_geometries")]
geometries: Vec<ArcGISGeometry>,
sr: i32,
}
impl UnionParameters {
pub fn builder() -> UnionParametersBuilder {
UnionParametersBuilder::default()
}
}
fn deserialize_plain_polygon<'de, D>(deserializer: D) -> Result<ArcGISGeometry, D::Error>
where
D: serde::Deserializer<'de>,
{
use serde::Deserialize;
let polygon: crate::ArcGISPolygon = crate::ArcGISPolygon::deserialize(deserializer)?;
Ok(ArcGISGeometry::Polygon(polygon))
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Getters)]
#[serde(rename_all = "camelCase")]
pub struct UnionResult {
#[serde(skip_serializing_if = "Option::is_none")]
geometry_type: Option<String>,
#[serde(deserialize_with = "deserialize_plain_polygon")]
geometry: ArcGISGeometry,
}
#[derive(Debug, Clone, Serialize, derive_builder::Builder, Getters)]
#[builder(setter(into, strip_option))]
#[serde(rename_all = "camelCase")]
pub struct AreasAndLengthsParameters {
#[serde(serialize_with = "serialize_plain_polygons")]
polygons: Vec<ArcGISGeometry>,
sr: i32,
#[serde(skip_serializing_if = "Option::is_none")]
length_unit: Option<LinearUnit>,
#[serde(skip_serializing_if = "Option::is_none")]
area_unit: Option<AreaUnit>,
#[serde(skip_serializing_if = "Option::is_none")]
calculation_type: Option<CalculationType>,
}
impl AreasAndLengthsParameters {
pub fn builder() -> AreasAndLengthsParametersBuilder {
AreasAndLengthsParametersBuilder::default()
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Getters)]
pub struct AreasAndLengthsResult {
areas: Vec<f64>,
lengths: Vec<f64>,
}
#[derive(Debug, Clone, Serialize, derive_builder::Builder, Getters)]
#[builder(setter(into, strip_option))]
#[serde(rename_all = "camelCase")]
pub struct DistanceParameters {
geometry1: ArcGISGeometry,
geometry2: ArcGISGeometry,
sr: i32,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default)]
distance_unit: Option<LinearUnit>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default)]
geodesic: Option<bool>,
}
impl DistanceParameters {
pub fn builder() -> DistanceParametersBuilder {
DistanceParametersBuilder::default()
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Getters)]
pub struct DistanceResult {
distance: f64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum AreaUnit {
#[serde(rename = "esriSquareMeters")]
SquareMeters,
#[serde(rename = "esriSquareKilometers")]
SquareKilometers,
#[serde(rename = "esriSquareFeet")]
SquareFeet,
#[serde(rename = "esriSquareMiles")]
SquareMiles,
#[serde(rename = "esriAcres")]
Acres,
#[serde(rename = "esriHectares")]
Hectares,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum CalculationType {
#[serde(rename = "planar")]
Planar,
#[serde(rename = "geodesic")]
Geodesic,
#[serde(rename = "preserveShape")]
PreserveShape,
}