use derive_getters::Getters;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Getters)]
#[serde(rename_all = "camelCase")]
pub struct GPExecuteResult {
results: Vec<GPResultParameter>,
messages: Vec<GPMessage>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Getters)]
#[serde(rename_all = "camelCase")]
pub struct GPResultParameter {
#[serde(default)]
param_name: Option<String>,
#[serde(default)]
data_type: Option<String>,
#[serde(default)]
value: Option<serde_json::Value>,
#[serde(default)]
param_url: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, Getters)]
#[serde(rename_all = "camelCase")]
pub struct GPMessage {
#[serde(rename = "type")]
message_type: GPMessageType,
description: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum GPMessageType {
#[serde(rename = "esriJobMessageTypeInformative")]
Informative,
#[serde(rename = "esriJobMessageTypeWarning")]
Warning,
#[serde(rename = "esriJobMessageTypeError")]
Error,
#[serde(rename = "esriJobMessageTypeEmpty")]
Empty,
#[serde(rename = "esriJobMessageTypeAbort")]
Abort,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum GPJobStatus {
#[serde(rename = "esriJobNew")]
New,
#[serde(rename = "esriJobSubmitted")]
Submitted,
#[serde(rename = "esriJobSubmitting")]
Submitting,
#[serde(rename = "esriJobWaiting")]
Waiting,
#[serde(rename = "esriJobExecuting")]
Executing,
#[serde(rename = "esriJobSucceeded")]
Succeeded,
#[serde(rename = "esriJobFailed")]
Failed,
#[serde(rename = "esriJobTimedOut")]
TimedOut,
#[serde(rename = "esriJobCancelling")]
Cancelling,
#[serde(rename = "esriJobCancelled")]
Cancelled,
#[serde(rename = "esriJobDeleting")]
Deleting,
#[serde(rename = "esriJobDeleted")]
Deleted,
}
impl GPJobStatus {
pub fn is_terminal(&self) -> bool {
matches!(
self,
GPJobStatus::Succeeded
| GPJobStatus::Failed
| GPJobStatus::TimedOut
| GPJobStatus::Cancelled
| GPJobStatus::Deleted
)
}
pub fn is_running(&self) -> bool {
matches!(
self,
GPJobStatus::New
| GPJobStatus::Submitted
| GPJobStatus::Submitting
| GPJobStatus::Waiting
| GPJobStatus::Executing
)
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Getters)]
#[serde(rename_all = "camelCase")]
pub struct GPProgress {
#[serde(rename = "type")]
progress_type: String,
message: String,
#[serde(default)]
percent: Option<f64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Getters)]
#[serde(rename_all = "camelCase")]
pub struct GPJobInfo {
job_id: String,
job_status: GPJobStatus,
#[serde(default)]
messages: Vec<GPMessage>,
#[serde(default)]
results: HashMap<String, GPResultParameter>,
#[serde(default)]
inputs: HashMap<String, GPResultParameter>,
#[serde(default)]
progress: Option<GPProgress>,
}