1use crate::ArcGISGeometry;
4use derive_getters::Getters;
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Getters)]
11#[serde(rename_all = "camelCase")]
12pub struct NALocation {
13 geometry: ArcGISGeometry,
15
16 #[serde(skip_serializing_if = "Option::is_none")]
18 name: Option<String>,
19
20 #[serde(skip_serializing_if = "Option::is_none")]
22 curb_approach: Option<CurbApproach>,
23
24 #[serde(skip_serializing_if = "Option::is_none")]
26 bearing: Option<f64>,
27
28 #[serde(skip_serializing_if = "Option::is_none")]
30 bearing_tolerance: Option<f64>,
31
32 #[serde(skip_serializing_if = "Option::is_none")]
34 nav_latency: Option<f64>,
35}
36
37impl NALocation {
38 pub fn new(geometry: ArcGISGeometry) -> Self {
40 Self {
41 geometry,
42 name: None,
43 curb_approach: None,
44 bearing: None,
45 bearing_tolerance: None,
46 nav_latency: None,
47 }
48 }
49
50 pub fn with_name(mut self, name: impl Into<String>) -> Self {
52 self.name = Some(name.into());
53 self
54 }
55
56 pub fn with_curb_approach(mut self, approach: CurbApproach) -> Self {
58 self.curb_approach = Some(approach);
59 self
60 }
61}
62
63#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
65pub enum CurbApproach {
66 #[serde(rename = "esriNAEitherSideOfVehicle")]
68 EitherSide = 0,
69 #[serde(rename = "esriNARightSideOfVehicle")]
71 RightSide = 1,
72 #[serde(rename = "esriNALeftSideOfVehicle")]
74 LeftSide = 2,
75 #[serde(rename = "esriNANoUTurn")]
77 NoUTurn = 3,
78}
79
80#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
82#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
83pub enum TravelMode {
84 DrivingTime,
86 DrivingDistance,
88 TruckingTime,
90 TruckingDistance,
92 WalkingTime,
94 WalkingDistance,
96 RuralDrivingTime,
98 RuralDrivingDistance,
100}
101
102#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
104pub enum ImpedanceAttribute {
105 #[serde(rename = "TravelTime")]
107 TravelTime,
108 #[serde(rename = "Miles")]
110 Miles,
111 #[serde(rename = "Kilometers")]
113 Kilometers,
114 #[serde(rename = "TimeAt1KPH")]
116 TimeAt1KPH,
117 #[serde(rename = "WalkTime")]
119 WalkTime,
120 #[serde(rename = "TruckTravelTime")]
122 TruckTravelTime,
123}
124
125#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
127pub enum RestrictionAttribute {
128 #[serde(rename = "Avoid Toll Roads")]
130 AvoidTollRoads,
131 #[serde(rename = "Avoid Limited Access Roads")]
133 AvoidHighways,
134 #[serde(rename = "Avoid Unpaved Roads")]
136 AvoidUnpavedRoads,
137 #[serde(rename = "Avoid Ferries")]
139 AvoidFerries,
140 #[serde(rename = "Avoid Gates")]
142 AvoidGates,
143 #[serde(rename = "Oneway")]
145 Oneway,
146 #[serde(rename = "Height Restriction")]
148 HeightRestriction,
149 #[serde(rename = "Weight Restriction")]
151 WeightRestriction,
152 #[serde(rename = "Weight per Axle Restriction")]
154 WeightPerAxleRestriction,
155 #[serde(rename = "Length Restriction")]
157 LengthRestriction,
158 #[serde(rename = "Width Restriction")]
160 WidthRestriction,
161}
162
163#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
165pub enum UTurnPolicy {
166 #[serde(rename = "esriNFSBAllowBacktrack")]
168 AllowBacktrack,
169 #[serde(rename = "esriNFSBAtDeadEndsOnly")]
171 AtDeadEndsOnly,
172 #[serde(rename = "esriNFSBAtDeadEndsAndIntersections")]
174 AtDeadEndsAndIntersections,
175 #[serde(rename = "esriNFSBNoBacktrack")]
177 NoBacktrack,
178}
179
180#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
182pub enum OutputLine {
183 #[serde(rename = "esriNAOutputLineNone")]
185 None,
186 #[serde(rename = "esriNAOutputLineStraight")]
188 Straight,
189 #[serde(rename = "esriNAOutputLineTrueShapeWithMeasure")]
191 TrueShapeWithMeasure,
192}
193
194#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
196pub enum TravelDirection {
197 #[serde(rename = "esriNATravelDirectionFromFacility")]
199 FromFacility,
200 #[serde(rename = "esriNATravelDirectionToFacility")]
202 ToFacility,
203}
204
205#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
207pub enum BarrierType {
208 Point,
210 Line,
212 Polygon,
214}
215
216#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
218pub enum DirectionsLength {
219 #[serde(rename = "esriNAMiles")]
221 Miles,
222 #[serde(rename = "esriNAKilometers")]
224 Kilometers,
225 #[serde(rename = "esriNAMeters")]
227 Meters,
228 #[serde(rename = "esriNAFeet")]
230 Feet,
231 #[serde(rename = "esriNAYards")]
233 Yards,
234 #[serde(rename = "esriNANauticalMiles")]
236 NauticalMiles,
237}
238
239#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
241pub enum DirectionsTimeAttribute {
242 #[serde(rename = "TravelTime")]
244 TravelTime,
245 #[serde(rename = "WalkTime")]
247 WalkTime,
248 #[serde(rename = "TruckTravelTime")]
250 TruckTravelTime,
251}
252
253#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
255pub enum DirectionsStyle {
256 #[serde(rename = "esriDMTStandard")]
258 Standard,
259 #[serde(rename = "esriDMTPrint")]
261 Print,
262 #[serde(rename = "esriDMTDesktop")]
264 Desktop,
265 #[serde(rename = "esriDMTNavigation")]
267 Navigation,
268}
269
270#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
272pub enum RouteShape {
273 #[serde(rename = "none")]
275 None,
276 #[serde(rename = "straight")]
278 Straight,
279 #[serde(rename = "true")]
281 True,
282 #[serde(rename = "trueShapeWithMeasures")]
284 TrueShapeWithMeasures,
285}
286
287#[derive(Debug, Clone, Serialize, derive_builder::Builder, Getters)]
291#[builder(setter(into, strip_option))]
292#[serde(rename_all = "camelCase")]
293pub struct RouteParameters {
294 stops: Vec<NALocation>,
297
298 #[serde(skip_serializing_if = "Option::is_none")]
300 #[builder(default)]
301 barriers: Option<Vec<NALocation>>,
302
303 #[serde(skip_serializing_if = "Option::is_none")]
305 #[builder(default)]
306 polyline_barriers: Option<Vec<ArcGISGeometry>>,
307
308 #[serde(skip_serializing_if = "Option::is_none")]
310 #[builder(default)]
311 polygon_barriers: Option<Vec<ArcGISGeometry>>,
312
313 #[serde(skip_serializing_if = "Option::is_none")]
315 #[builder(default)]
316 return_directions: Option<bool>,
317
318 #[serde(skip_serializing_if = "Option::is_none")]
320 #[builder(default)]
321 return_routes: Option<bool>,
322
323 #[serde(skip_serializing_if = "Option::is_none")]
325 #[builder(default)]
326 return_stops: Option<bool>,
327
328 #[serde(skip_serializing_if = "Option::is_none")]
330 #[builder(default)]
331 return_barriers: Option<bool>,
332
333 #[serde(skip_serializing_if = "Option::is_none")]
335 #[builder(default)]
336 out_sr: Option<i32>,
337
338 #[serde(skip_serializing_if = "Option::is_none")]
340 #[builder(default)]
341 impedance_attribute: Option<ImpedanceAttribute>,
342
343 #[serde(skip_serializing_if = "Option::is_none")]
345 #[builder(default)]
346 restriction_attribute_names: Option<Vec<RestrictionAttribute>>,
347
348 #[serde(skip_serializing_if = "Option::is_none")]
350 #[builder(default)]
351 attribute_parameter_values: Option<serde_json::Value>,
352
353 #[serde(skip_serializing_if = "Option::is_none")]
355 #[builder(default)]
356 use_hierarchy: Option<bool>,
357
358 #[serde(skip_serializing_if = "Option::is_none")]
360 #[builder(default)]
361 start_time: Option<i64>,
362
363 #[serde(skip_serializing_if = "Option::is_none")]
365 #[builder(default)]
366 uturn_policy: Option<UTurnPolicy>,
367
368 #[serde(skip_serializing_if = "Option::is_none")]
370 #[builder(default)]
371 directions_length_units: Option<DirectionsLength>,
372
373 #[serde(skip_serializing_if = "Option::is_none")]
375 #[builder(default)]
376 directions_time_attribute: Option<DirectionsTimeAttribute>,
377
378 #[serde(skip_serializing_if = "Option::is_none")]
380 #[builder(default)]
381 directions_style: Option<DirectionsStyle>,
382
383 #[serde(skip_serializing_if = "Option::is_none")]
385 #[builder(default)]
386 directions_language: Option<String>,
387
388 #[serde(skip_serializing_if = "Option::is_none")]
390 #[builder(default)]
391 preserve_first_stop: Option<bool>,
392
393 #[serde(skip_serializing_if = "Option::is_none")]
395 #[builder(default)]
396 preserve_last_stop: Option<bool>,
397
398 #[serde(skip_serializing_if = "Option::is_none")]
400 #[builder(default)]
401 find_best_sequence: Option<bool>,
402
403 #[serde(skip_serializing_if = "Option::is_none")]
405 #[builder(default)]
406 return_to_start: Option<bool>,
407
408 #[serde(skip_serializing_if = "Option::is_none")]
410 #[builder(default)]
411 use_time_windows: Option<bool>,
412
413 #[serde(skip_serializing_if = "Option::is_none")]
415 #[builder(default)]
416 accumulate_attribute_names: Option<Vec<String>>,
417
418 #[serde(skip_serializing_if = "Option::is_none")]
420 #[builder(default)]
421 output_lines: Option<OutputLine>,
422
423 #[serde(skip_serializing_if = "Option::is_none")]
425 #[builder(default)]
426 travel_mode: Option<TravelMode>,
427}
428
429impl RouteParameters {
430 pub fn builder() -> RouteParametersBuilder {
432 RouteParametersBuilder::default()
433 }
434}
435
436#[derive(Debug, Clone, PartialEq, Serialize, Getters)]
438#[serde(rename_all = "camelCase")]
439pub struct RouteResult {
440 #[serde(default)]
442 routes: Vec<Route>,
443
444 #[serde(default)]
446 stops: Vec<Stop>,
447
448 #[serde(default)]
450 barriers: Vec<NALocation>,
451
452 #[serde(default)]
454 messages: Vec<NAMessage>,
455}
456
457impl<'de> serde::Deserialize<'de> for RouteResult {
458 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
459 where
460 D: serde::Deserializer<'de>,
461 {
462 use serde::de::{MapAccess, Visitor};
463 use std::fmt;
464
465 struct RouteResultVisitor;
466
467 impl<'de> Visitor<'de> for RouteResultVisitor {
468 type Value = RouteResult;
469
470 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
471 formatter.write_str("a RouteResult with FeatureSet routes and stops")
472 }
473
474 fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
475 where
476 A: MapAccess<'de>,
477 {
478 let mut routes_fs: Option<crate::FeatureSet> = None;
479 let mut stops_fs: Option<crate::FeatureSet> = None;
480 let mut barriers: Option<Vec<NALocation>> = None;
481 let mut messages: Option<Vec<NAMessage>> = None;
482
483 while let Some(key) = map.next_key::<String>()? {
484 match key.as_str() {
485 "routes" => {
486 routes_fs = Some(map.next_value()?);
487 }
488 "stops" => {
489 stops_fs = Some(map.next_value()?);
490 }
491 "barriers" => {
492 barriers = Some(map.next_value()?);
493 }
494 "messages" => {
495 messages = Some(map.next_value()?);
496 }
497 _ => {
498 let _: serde::de::IgnoredAny = map.next_value()?;
500 }
501 }
502 }
503
504 let routes_fs = routes_fs.unwrap_or_default();
505 let stops_fs = stops_fs.unwrap_or_default();
506 let barriers = barriers.unwrap_or_default();
507 let messages = messages.unwrap_or_default();
508
509 tracing::debug!(
510 route_feature_count = routes_fs.features().len(),
511 stop_feature_count = stops_fs.features().len(),
512 "Deserializing RouteResult from FeatureSets"
513 );
514
515 let routes: Vec<Route> = routes_fs
517 .features()
518 .iter()
519 .map(Route::from_feature)
520 .collect();
521
522 let stops: Vec<Stop> = stops_fs.features().iter().map(Stop::from_feature).collect();
524
525 tracing::debug!(
526 route_count = routes.len(),
527 stop_count = stops.len(),
528 "Successfully deserialized RouteResult"
529 );
530
531 Ok(RouteResult {
532 routes,
533 stops,
534 barriers,
535 messages,
536 })
537 }
538 }
539
540 deserializer.deserialize_map(RouteResultVisitor)
541 }
542}
543
544#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Getters)]
546#[serde(rename_all = "camelCase")]
547pub struct Route {
548 #[serde(skip_serializing_if = "Option::is_none")]
550 name: Option<String>,
551
552 #[serde(skip_serializing_if = "Option::is_none")]
554 total_length: Option<f64>,
555
556 #[serde(skip_serializing_if = "Option::is_none")]
558 total_time: Option<f64>,
559
560 #[serde(skip_serializing_if = "Option::is_none")]
562 total_drive_time: Option<f64>,
563
564 #[serde(skip_serializing_if = "Option::is_none")]
566 total_wait_time: Option<f64>,
567
568 #[serde(skip_serializing_if = "Option::is_none")]
570 geometry: Option<ArcGISGeometry>,
571
572 #[serde(default)]
574 directions: Vec<Direction>,
575
576 #[serde(skip_serializing_if = "Option::is_none")]
578 start_time: Option<i64>,
579
580 #[serde(skip_serializing_if = "Option::is_none")]
582 end_time: Option<i64>,
583}
584
585impl Route {
586 fn from_feature(feature: &crate::Feature) -> Self {
590 tracing::debug!("Converting FeatureSet feature to Route");
591
592 let attrs = feature.attributes();
593
594 let name = attrs
595 .get("Name")
596 .and_then(|v| v.as_str())
597 .map(|s| s.to_string());
598
599 let total_length = attrs.get("Total_Miles").and_then(|v| v.as_f64());
600
601 let total_time = attrs.get("Total_TravelTime").and_then(|v| v.as_f64());
602
603 let total_drive_time = attrs.get("Total_DriveTime").and_then(|v| v.as_f64());
604
605 let total_wait_time = attrs.get("Total_WaitTime").and_then(|v| v.as_f64());
606
607 let geometry = feature.geometry().clone();
608
609 tracing::debug!(
610 name = ?name,
611 total_miles = ?total_length,
612 total_time_minutes = ?total_time,
613 "Extracted route data from feature"
614 );
615
616 Route {
617 name,
618 total_length,
619 total_time,
620 total_drive_time,
621 total_wait_time,
622 geometry,
623 directions: Vec::new(), start_time: None, end_time: None, }
627 }
628}
629
630#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Getters)]
632#[serde(rename_all = "camelCase")]
633pub struct Stop {
634 #[serde(skip_serializing_if = "Option::is_none")]
636 name: Option<String>,
637
638 #[serde(skip_serializing_if = "Option::is_none")]
640 geometry: Option<ArcGISGeometry>,
641
642 #[serde(skip_serializing_if = "Option::is_none")]
644 arrival_time: Option<i64>,
645
646 #[serde(skip_serializing_if = "Option::is_none")]
648 departure_time: Option<i64>,
649
650 #[serde(skip_serializing_if = "Option::is_none")]
652 wait_time: Option<f64>,
653
654 #[serde(skip_serializing_if = "Option::is_none")]
656 cumulative_length: Option<f64>,
657
658 #[serde(skip_serializing_if = "Option::is_none")]
660 sequence: Option<i32>,
661}
662
663impl Stop {
664 fn from_feature(feature: &crate::Feature) -> Self {
668 tracing::debug!("Converting FeatureSet feature to Stop");
669
670 let attrs = feature.attributes();
671
672 let name = attrs
673 .get("Name")
674 .and_then(|v| v.as_str())
675 .map(|s| s.to_string());
676
677 let geometry = feature.geometry().clone();
678
679 let arrival_time = None; let departure_time = None; let wait_time = None; let cumulative_length = attrs.get("Cumul_Miles").and_then(|v| v.as_f64());
686
687 let sequence = attrs
688 .get("Sequence")
689 .and_then(|v| v.as_i64())
690 .map(|i| i as i32);
691
692 tracing::debug!(
693 name = ?name,
694 sequence = ?sequence,
695 cumul_miles = ?cumulative_length,
696 "Extracted stop data from feature"
697 );
698
699 Stop {
700 name,
701 geometry,
702 arrival_time,
703 departure_time,
704 wait_time,
705 cumulative_length,
706 sequence,
707 }
708 }
709}
710
711#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Getters)]
713#[serde(rename_all = "camelCase")]
714pub struct Direction {
715 #[serde(skip_serializing_if = "Option::is_none")]
717 text: Option<String>,
718
719 #[serde(skip_serializing_if = "Option::is_none")]
721 length: Option<f64>,
722
723 #[serde(skip_serializing_if = "Option::is_none")]
725 time: Option<f64>,
726
727 #[serde(skip_serializing_if = "Option::is_none")]
729 geometry: Option<ArcGISGeometry>,
730
731 #[serde(skip_serializing_if = "Option::is_none")]
733 maneuver_type: Option<String>,
734}
735
736#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Getters)]
738#[serde(rename_all = "camelCase")]
739pub struct NAMessage {
740 #[serde(rename = "type")]
742 message_type: i32,
743
744 description: String,
746}
747
748#[derive(Debug, Clone, Serialize, derive_builder::Builder, Getters)]
752#[builder(setter(into, strip_option))]
753#[serde(rename_all = "camelCase")]
754pub struct ServiceAreaParameters {
755 facilities: Vec<NALocation>,
757
758 default_breaks: Vec<f64>,
761
762 #[serde(skip_serializing_if = "Option::is_none")]
764 #[builder(default)]
765 barriers: Option<Vec<NALocation>>,
766
767 #[serde(skip_serializing_if = "Option::is_none")]
769 #[builder(default)]
770 polyline_barriers: Option<Vec<ArcGISGeometry>>,
771
772 #[serde(skip_serializing_if = "Option::is_none")]
774 #[builder(default)]
775 polygon_barriers: Option<Vec<ArcGISGeometry>>,
776
777 #[serde(skip_serializing_if = "Option::is_none")]
779 #[builder(default)]
780 travel_direction: Option<TravelDirection>,
781
782 #[serde(skip_serializing_if = "Option::is_none")]
784 #[builder(default)]
785 out_sr: Option<i32>,
786
787 #[serde(skip_serializing_if = "Option::is_none")]
789 #[builder(default)]
790 impedance_attribute: Option<ImpedanceAttribute>,
791
792 #[serde(skip_serializing_if = "Option::is_none")]
794 #[builder(default)]
795 merge_similar_polygon_ranges: Option<bool>,
796
797 #[serde(skip_serializing_if = "Option::is_none")]
799 #[builder(default)]
800 split_polygons_at_breaks: Option<bool>,
801
802 #[serde(skip_serializing_if = "Option::is_none")]
804 #[builder(default)]
805 trim_outer_polygon: Option<bool>,
806
807 #[serde(skip_serializing_if = "Option::is_none")]
809 #[builder(default)]
810 trim_polygon_distance: Option<f64>,
811
812 #[serde(skip_serializing_if = "Option::is_none")]
814 #[builder(default)]
815 time_of_day: Option<i64>,
816
817 #[serde(skip_serializing_if = "Option::is_none")]
819 #[builder(default)]
820 use_hierarchy: Option<bool>,
821
822 #[serde(skip_serializing_if = "Option::is_none")]
824 #[builder(default)]
825 uturn_policy: Option<UTurnPolicy>,
826
827 #[serde(skip_serializing_if = "Option::is_none")]
829 #[builder(default)]
830 restriction_attribute_names: Option<Vec<RestrictionAttribute>>,
831
832 #[serde(skip_serializing_if = "Option::is_none")]
834 #[builder(default)]
835 travel_mode: Option<TravelMode>,
836
837 #[serde(skip_serializing_if = "Option::is_none")]
839 #[builder(default)]
840 return_facilities: Option<bool>,
841
842 #[serde(skip_serializing_if = "Option::is_none")]
844 #[builder(default)]
845 return_barriers: Option<bool>,
846
847 #[serde(skip_serializing_if = "Option::is_none")]
849 #[builder(default)]
850 return_polygons: Option<bool>,
851}
852
853impl ServiceAreaParameters {
854 pub fn builder() -> ServiceAreaParametersBuilder {
856 ServiceAreaParametersBuilder::default()
857 }
858}
859
860#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
862#[serde(bound(deserialize = "T: serde::Deserialize<'de>"))]
863struct ServiceAreaFeatureSet<T> {
864 #[serde(default)]
865 features: Vec<T>,
866}
867
868impl<T> Default for ServiceAreaFeatureSet<T> {
869 fn default() -> Self {
870 Self {
871 features: Vec::new(),
872 }
873 }
874}
875
876#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
878#[serde(rename_all = "camelCase")]
879pub struct ServiceAreaResult {
880 #[serde(default, rename = "saPolygons")]
882 sapolygons_raw: ServiceAreaFeatureSet<ServiceAreaPolygon>,
883
884 #[serde(default, rename = "saPolylines")]
886 sapolylines_raw: ServiceAreaFeatureSet<ServiceAreaPolyline>,
887
888 #[serde(default)]
890 facilities: Vec<NALocation>,
891
892 #[serde(default)]
894 messages: Vec<NAMessage>,
895}
896
897impl ServiceAreaResult {
898 pub fn service_area_polygons(&self) -> &[ServiceAreaPolygon] {
900 &self.sapolygons_raw.features
901 }
902
903 pub fn service_area_polylines(&self) -> &[ServiceAreaPolyline] {
905 &self.sapolylines_raw.features
906 }
907
908 pub fn facilities(&self) -> &[NALocation] {
910 &self.facilities
911 }
912
913 pub fn messages(&self) -> &[NAMessage] {
915 &self.messages
916 }
917}
918
919#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Getters)]
921#[serde(rename_all = "camelCase")]
922pub struct ServiceAreaPolygon {
923 #[serde(skip_serializing_if = "Option::is_none")]
925 facility_id: Option<i32>,
926
927 #[serde(skip_serializing_if = "Option::is_none")]
929 from_break: Option<f64>,
930
931 #[serde(skip_serializing_if = "Option::is_none")]
933 to_break: Option<f64>,
934
935 #[serde(skip_serializing_if = "Option::is_none")]
937 geometry: Option<ArcGISGeometry>,
938}
939
940#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Getters)]
942#[serde(rename_all = "camelCase")]
943pub struct ServiceAreaPolyline {
944 #[serde(skip_serializing_if = "Option::is_none")]
946 facility_id: Option<i32>,
947
948 #[serde(skip_serializing_if = "Option::is_none")]
950 from_break: Option<f64>,
951
952 #[serde(skip_serializing_if = "Option::is_none")]
954 to_break: Option<f64>,
955
956 #[serde(skip_serializing_if = "Option::is_none")]
958 geometry: Option<ArcGISGeometry>,
959}
960
961#[derive(Debug, Clone, Serialize, derive_builder::Builder, Getters)]
965#[builder(setter(into, strip_option))]
966#[serde(rename_all = "camelCase")]
967pub struct ClosestFacilityParameters {
968 incidents: Vec<NALocation>,
970
971 facilities: Vec<NALocation>,
973
974 #[serde(skip_serializing_if = "Option::is_none")]
976 #[builder(default)]
977 default_target_facility_count: Option<i32>,
978
979 #[serde(skip_serializing_if = "Option::is_none")]
981 #[builder(default)]
982 barriers: Option<Vec<NALocation>>,
983
984 #[serde(skip_serializing_if = "Option::is_none")]
986 #[builder(default)]
987 polyline_barriers: Option<Vec<ArcGISGeometry>>,
988
989 #[serde(skip_serializing_if = "Option::is_none")]
991 #[builder(default)]
992 polygon_barriers: Option<Vec<ArcGISGeometry>>,
993
994 #[serde(skip_serializing_if = "Option::is_none")]
996 #[builder(default)]
997 travel_direction: Option<TravelDirection>,
998
999 #[serde(skip_serializing_if = "Option::is_none")]
1001 #[builder(default)]
1002 out_sr: Option<i32>,
1003
1004 #[serde(skip_serializing_if = "Option::is_none")]
1006 #[builder(default)]
1007 impedance_attribute: Option<ImpedanceAttribute>,
1008
1009 #[serde(skip_serializing_if = "Option::is_none")]
1011 #[builder(default)]
1012 accumulate_attribute_names: Option<Vec<String>>,
1013
1014 #[serde(skip_serializing_if = "Option::is_none")]
1016 #[builder(default)]
1017 return_directions: Option<bool>,
1018
1019 #[serde(skip_serializing_if = "Option::is_none")]
1021 #[builder(default)]
1022 return_routes: Option<bool>,
1023
1024 #[serde(skip_serializing_if = "Option::is_none")]
1026 #[builder(default)]
1027 return_facilities: Option<bool>,
1028
1029 #[serde(skip_serializing_if = "Option::is_none")]
1031 #[builder(default)]
1032 return_incidents: Option<bool>,
1033
1034 #[serde(skip_serializing_if = "Option::is_none")]
1036 #[builder(default)]
1037 return_barriers: Option<bool>,
1038
1039 #[serde(skip_serializing_if = "Option::is_none")]
1041 #[builder(default)]
1042 output_lines: Option<OutputLine>,
1043
1044 #[serde(skip_serializing_if = "Option::is_none")]
1046 #[builder(default)]
1047 time_of_day: Option<i64>,
1048
1049 #[serde(skip_serializing_if = "Option::is_none")]
1051 #[builder(default)]
1052 use_hierarchy: Option<bool>,
1053
1054 #[serde(skip_serializing_if = "Option::is_none")]
1056 #[builder(default)]
1057 uturn_policy: Option<UTurnPolicy>,
1058
1059 #[serde(skip_serializing_if = "Option::is_none")]
1061 #[builder(default)]
1062 restriction_attribute_names: Option<Vec<RestrictionAttribute>>,
1063
1064 #[serde(skip_serializing_if = "Option::is_none")]
1066 #[builder(default)]
1067 travel_mode: Option<TravelMode>,
1068}
1069
1070impl ClosestFacilityParameters {
1071 pub fn builder() -> ClosestFacilityParametersBuilder {
1073 ClosestFacilityParametersBuilder::default()
1074 }
1075}
1076
1077#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1079#[serde(bound(deserialize = "T: serde::Deserialize<'de>"))]
1080struct ClosestFacilityFeatureSet<T> {
1081 #[serde(default)]
1082 features: Vec<T>,
1083}
1084
1085impl<T> Default for ClosestFacilityFeatureSet<T> {
1086 fn default() -> Self {
1087 Self {
1088 features: Vec::new(),
1089 }
1090 }
1091}
1092
1093#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1095#[serde(rename_all = "camelCase")]
1096pub struct ClosestFacilityResult {
1097 #[serde(default)]
1099 routes: ClosestFacilityFeatureSet<Route>,
1100
1101 #[serde(default)]
1103 facilities: Vec<NALocation>,
1104
1105 #[serde(default)]
1107 incidents: Vec<NALocation>,
1108
1109 #[serde(default)]
1111 messages: Vec<NAMessage>,
1112}
1113
1114impl ClosestFacilityResult {
1115 pub fn routes(&self) -> &[Route] {
1117 &self.routes.features
1118 }
1119
1120 pub fn facilities(&self) -> &[NALocation] {
1122 &self.facilities
1123 }
1124
1125 pub fn incidents(&self) -> &[NALocation] {
1127 &self.incidents
1128 }
1129
1130 pub fn messages(&self) -> &[NAMessage] {
1132 &self.messages
1133 }
1134}
1135
1136#[derive(Debug, Clone, Serialize, derive_builder::Builder, Getters)]
1140#[builder(setter(into, strip_option))]
1141#[serde(rename_all = "camelCase")]
1142pub struct ODCostMatrixParameters {
1143 origins: Vec<NALocation>,
1145
1146 destinations: Vec<NALocation>,
1148
1149 #[serde(skip_serializing_if = "Option::is_none")]
1151 #[builder(default)]
1152 barriers: Option<Vec<NALocation>>,
1153
1154 #[serde(skip_serializing_if = "Option::is_none")]
1156 #[builder(default)]
1157 polyline_barriers: Option<Vec<ArcGISGeometry>>,
1158
1159 #[serde(skip_serializing_if = "Option::is_none")]
1161 #[builder(default)]
1162 polygon_barriers: Option<Vec<ArcGISGeometry>>,
1163
1164 #[serde(skip_serializing_if = "Option::is_none")]
1166 #[builder(default)]
1167 travel_direction: Option<TravelDirection>,
1168
1169 #[serde(skip_serializing_if = "Option::is_none")]
1171 #[builder(default)]
1172 out_sr: Option<i32>,
1173
1174 #[serde(skip_serializing_if = "Option::is_none")]
1176 #[builder(default)]
1177 impedance_attribute: Option<ImpedanceAttribute>,
1178
1179 #[serde(skip_serializing_if = "Option::is_none")]
1181 #[builder(default)]
1182 accumulate_attribute_names: Option<Vec<String>>,
1183
1184 #[serde(skip_serializing_if = "Option::is_none")]
1186 #[builder(default)]
1187 time_of_day: Option<i64>,
1188
1189 #[serde(skip_serializing_if = "Option::is_none")]
1191 #[builder(default)]
1192 use_hierarchy: Option<bool>,
1193
1194 #[serde(skip_serializing_if = "Option::is_none")]
1196 #[builder(default)]
1197 uturn_policy: Option<UTurnPolicy>,
1198
1199 #[serde(skip_serializing_if = "Option::is_none")]
1201 #[builder(default)]
1202 restriction_attribute_names: Option<Vec<RestrictionAttribute>>,
1203
1204 #[serde(skip_serializing_if = "Option::is_none")]
1206 #[builder(default)]
1207 travel_mode: Option<TravelMode>,
1208}
1209
1210impl ODCostMatrixParameters {
1211 pub fn builder() -> ODCostMatrixParametersBuilder {
1213 ODCostMatrixParametersBuilder::default()
1214 }
1215}
1216
1217#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Getters)]
1219#[serde(rename_all = "camelCase")]
1220pub struct ODCostMatrixResult {
1221 #[serde(default, rename = "odLines")]
1223 od_lines: Vec<ODLine>,
1224
1225 #[serde(default)]
1227 origins: Vec<NALocation>,
1228
1229 #[serde(default)]
1231 destinations: Vec<NALocation>,
1232
1233 #[serde(default)]
1235 messages: Vec<NAMessage>,
1236}
1237
1238#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Getters)]
1240#[serde(rename_all = "camelCase")]
1241pub struct ODLine {
1242 #[serde(skip_serializing_if = "Option::is_none")]
1244 origin_id: Option<i32>,
1245
1246 #[serde(skip_serializing_if = "Option::is_none")]
1248 destination_id: Option<i32>,
1249
1250 #[serde(skip_serializing_if = "Option::is_none")]
1252 total_time: Option<f64>,
1253
1254 #[serde(skip_serializing_if = "Option::is_none")]
1256 total_distance: Option<f64>,
1257
1258 #[serde(skip_serializing_if = "Option::is_none")]
1260 origin_name: Option<String>,
1261
1262 #[serde(skip_serializing_if = "Option::is_none")]
1264 destination_name: Option<String>,
1265}