1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
pub mod data_services;
pub mod reference;

use crate::xml::{default_xml_namespace_edmx, default_xml_namespace_m, default_xml_namespace_sap};
use data_services::DataServices;
use reference::Reference;
use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize)]
pub enum EdmxVersion {
    #[serde(rename = "1.0")]
    V1_0,

    #[serde(rename = "2.0")]
    V2_0,
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Entity Data Model
//
// Child Nodes:
//   1:1 edmx:DataServices
//
// WARNING: quick-xml strips the namespace from XML tag names, but not attribute names!
//
// Consequently, tag names such as "edmx:DataServices" and "atom:link" will appear simply as "DataServices" and "link"
// etc, but attribute names such as "sap:schema-version" will appear without modification
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct Edmx {
    pub version: EdmxVersion,

    #[serde(rename = "xmlns:edmx", default = "default_xml_namespace_edmx")]
    pub namespace_edmx: String,

    #[serde(rename = "xmlns:m", default = "default_xml_namespace_m")]
    pub namespace_m: String,

    #[serde(rename = "xmlns:sap", default = "default_xml_namespace_sap")]
    pub namespace_sap: String,

    #[serde(rename = "Reference")]
    pub references: Option<Vec<Reference>>,

    pub data_services: DataServices,
}

impl std::str::FromStr for Edmx {
    type Err = quick_xml::DeError;

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        quick_xml::de::from_str(s)
    }
}