use std::sync::Arc; use datatype::DataType; use serde::ser::{SerializeMap, Serializer}; use serde::{Deserialize, Serialize}; use validation::Validation; mod datatype; mod validation; #[derive(Clone, Debug)] pub struct Parameter { name: Arc, data_type: DataType, #[allow(dead_code)] is_array: bool, aliases: Vec>, description: Option>, help_message: Option>, parameter_sets: Vec, validations: Vec, } impl Serialize for Parameter { fn serialize(&self, serializer: S) -> Result where S: Serializer, { let mut state = serializer.serialize_map(None)?; state.serialize_entry("name", &self.name)?; let mut type_str = format!("{}", self.data_type); if self.is_array { type_str.push_str("[]"); } state.serialize_entry("type", &type_str)?; state.serialize_entry("aliases", &self.aliases)?; if let Some(desc) = &self.description { state.serialize_entry("description", desc)?; } if let Some(help) = &self.help_message { state.serialize_entry("helpMessage", help)?; } state.serialize_entry("parameterSets", &self.parameter_sets)?; state.serialize_entry("validations", &self.validations)?; state.end() } } impl<'de> Deserialize<'de> for Parameter { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de>, { #[derive(Deserialize)] #[serde(rename_all = "camelCase")] struct RawParameter { name: Arc, #[serde(rename = "type")] data_type: String, aliases: Vec>, description: Option>, help_message: Option>, parameter_sets: Vec, validations: Vec, } let raw = RawParameter::deserialize(deserializer)?; let is_array = raw.data_type.ends_with("[]"); let type_str = raw.data_type.trim_end_matches("[]"); let data_type: DataType = serde_json::from_str(&format!("\"{}\"", type_str)).map_err(serde::de::Error::custom)?; Ok(Parameter { name: raw.name, data_type, is_array, aliases: raw.aliases, description: raw.description, help_message: raw.help_message, parameter_sets: raw.parameter_sets, validations: raw.validations, }) } } #[derive(Deserialize, Serialize, Clone, PartialEq, Eq, Default, Debug)] pub struct ParameterSet { name: Arc, mandatory: bool, position: Option, value_from_pipeline: Option, value_from_pipeline_by_property_name: Option, }