ogcapi-types 0.3.0

Types as defined by various OGC API Standards.
Documentation
use std::{collections::HashMap, ops::Deref};

use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use serde_with::{StringWithSeparator, formats::SpaceSeparator};

use crate::common::{Links, query::LimitOffsetPagination};

use super::execute::InlineOrRefData;

#[derive(Serialize, Deserialize, Debug, Default)]
pub struct JobList {
    jobs: Vec<StatusInfo>,
    links: Links,
}

#[derive(Serialize, Deserialize, Debug, Clone, Default)]
pub struct StatusInfo {
    #[serde(rename = "processID", alias = "process_id")]
    pub process_id: Option<String>,
    #[serde(rename = "jobID", alias = "job_id")]
    pub job_id: String,
    pub status: StatusCode,
    pub message: Option<String>,
    pub created: Option<DateTime<Utc>>,
    pub finished: Option<DateTime<Utc>>,
    pub updated: Option<DateTime<Utc>>,
    pub progress: Option<i8>,
    #[serde(default)]
    pub links: Links,
}

#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum StatusCode {
    Accepted,
    Running,
    Successful,
    Failed,
    Dismissed,
}

impl Default for StatusCode {
    fn default() -> Self {
        Self::Accepted
    }
}

#[serde_with::serde_as]
#[derive(Deserialize, Debug)]
pub struct ResultsQuery {
    #[serde(flatten)]
    pub pagination: LimitOffsetPagination,
    #[serde(default)]
    #[serde_as(as = "Option<StringWithSeparator::<SpaceSeparator, String>>")]
    pub outputs: Option<Vec<String>>,
}

#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Results {
    #[serde(flatten)]
    pub results: HashMap<String, InlineOrRefData>,
}

impl Deref for Results {
    type Target = HashMap<String, InlineOrRefData>;

    fn deref(&self) -> &Self::Target {
        &self.results
    }
}