pub mod association;
pub mod complex_type;
pub mod entity_container;
pub mod entity_type;
use crate::{
atom::AtomLink,
oasis::annotations::Annotations,
parser::syntax_fragments::*,
sap_annotations::SAPAnnotationsSchema,
xml::{default_xml_language, default_xml_namespace},
};
use association::Association;
use complex_type::ComplexType;
use entity_container::EntityContainer;
use entity_type::EntityType;
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize)]
pub struct Schema {
#[serde(rename = "@xmlns", default = "default_xml_namespace")]
pub xml_namespace: String,
#[serde(rename = "@Namespace", default)]
pub namespace: String,
#[serde(rename = "@xml:lang", default = "default_xml_language")]
pub xml_lang: String,
#[serde(flatten)]
pub sap_annotations: SAPAnnotationsSchema,
#[serde(rename = "EntityType", default)]
pub entity_types: Vec<EntityType>,
#[serde(rename = "ComplexType", default)]
pub complex_types: Option<Vec<ComplexType>>,
#[serde(rename = "Association", default)]
pub associations: Vec<Association>,
#[serde(rename = "EntityContainer", default)]
pub entity_container: Option<EntityContainer>,
#[serde(rename = "Annotations", default)]
pub annotation_list: Option<Vec<Annotations>>,
#[serde(rename = "link")]
pub atom_links: Vec<AtomLink>,
}
impl Schema {
pub fn to_entity_types_enum(&self) -> Vec<u8> {
let pascal_entity_types_name = format!(
"{}EntityTypes",
convert_case::Casing::to_case(&self.namespace, convert_case::Case::Pascal)
);
let mut output_enum = [
derive_str(vec![DeriveTraits::DEBUG]).as_slice(),
START_ENUM,
pascal_entity_types_name.as_bytes(),
SPACE,
OPEN_CURLY,
LINE_FEED,
]
.concat();
let output_impl = [START_IMPL, pascal_entity_types_name.as_bytes(), SPACE, OPEN_CURLY, LINE_FEED].concat();
let mut fn_value = [FN_VALUE_DECL, LINE_FEED, MATCH_SELF, LINE_FEED].concat();
for ent_type in self.entity_types.iter() {
let ent_type_name_camel = convert_case::Casing::to_case(&ent_type.name, convert_case::Case::UpperCamel);
output_enum.append(&mut [ent_type_name_camel.as_bytes(), COMMA, LINE_FEED].concat());
fn_value.append(
&mut [
pascal_entity_types_name.as_bytes(),
COLON2,
ent_type_name_camel.as_bytes(),
SPACE,
FAT_ARROW,
SPACE,
DOUBLE_QUOTE,
&ent_type.name.as_bytes(),
DOUBLE_QUOTE,
COMMA,
LINE_FEED,
]
.concat(),
);
}
output_enum.append(&mut [LINE_FEED, CLOSE_CURLY, LINE_FEED, LINE_FEED].concat());
fn_value.append(&mut [LINE_FEED, CLOSE_CURLY, LINE_FEED, CLOSE_CURLY, LINE_FEED].concat());
return [
output_enum,
output_impl,
fn_value,
CLOSE_CURLY.to_vec(),
LINE_FEED.to_vec(),
LINE_FEED.to_vec(),
]
.concat();
}
}