use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use super::id::*;
use super::status::*;
use super::{Resource, ResourceCommon, Updatable};
#[derive(Clone, Debug, Deserialize, Resource, Serialize, Updatable)]
#[api_name = "source"]
#[non_exhaustive]
pub struct Source {
#[serde(flatten)]
#[updatable(flatten)]
pub common: ResourceCommon,
pub resource: Id<Source>,
pub status: GenericStatus,
pub file_name: Option<String>,
pub md5: String,
pub size: u64,
#[updatable]
pub disable_datetime: Option<bool>,
#[updatable]
pub fields: Option<HashMap<String, Field>>,
}
#[derive(Debug, Serialize)]
#[non_exhaustive]
pub struct Args {
#[serde(skip_serializing_if = "Option::is_none")]
pub remote: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub disable_datetime: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub tags: Vec<String>,
}
impl Args {
pub fn remote<S: Into<String>>(remote: S) -> Args {
Args {
remote: Some(remote.into()),
data: None,
disable_datetime: None,
name: None,
tags: vec![],
}
}
pub fn data<S: Into<String>>(data: S) -> Args {
Args {
remote: None,
data: Some(data.into()),
disable_datetime: None,
name: None,
tags: vec![],
}
}
}
impl super::Args for Args {
type Resource = Source;
}
#[derive(Clone, Debug, Deserialize, Serialize, Updatable)]
#[non_exhaustive]
pub struct Field {
pub name: String,
#[updatable]
pub optype: Optype,
#[updatable]
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub time_formats: Vec<String>,
}
#[derive(Clone, Copy, Debug, Deserialize, PartialEq, Serialize)]
#[non_exhaustive]
pub enum Optype {
#[serde(rename = "datetime")]
DateTime,
#[serde(rename = "numeric")]
Numeric,
#[serde(rename = "categorical")]
Categorical,
#[serde(rename = "text")]
Text,
#[serde(rename = "items")]
Items,
}
impl Updatable for Optype {
type Update = Self;
}
#[test]
fn update_source_name() {
use super::ResourceCommonUpdate;
use serde_json::json;
let source_update = SourceUpdate {
common: Some(ResourceCommonUpdate {
name: Some("example".to_owned()),
..ResourceCommonUpdate::default()
}),
..SourceUpdate::default()
};
assert_eq!(json!(source_update), json!({ "name": "example" }));
}