feat: add soap core domain model
This commit is contained in:
@@ -4,4 +4,4 @@ mod normalize;
|
||||
mod validate;
|
||||
|
||||
pub use error::SchemaError;
|
||||
pub use model::{Schema, SchemaKind};
|
||||
pub use model::{Schema, SchemaKind, XmlNodeKind, XmlQualifiedName, XmlSchemaBinding};
|
||||
|
||||
@@ -3,6 +3,33 @@ use std::collections::BTreeMap;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use serde_json::Value;
|
||||
|
||||
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
|
||||
#[serde(rename_all = "snake_case")]
|
||||
pub enum XmlNodeKind {
|
||||
Element,
|
||||
Attribute,
|
||||
Text,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
|
||||
pub struct XmlQualifiedName {
|
||||
pub local_name: String,
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
pub namespace_uri: Option<String>,
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
pub prefix: Option<String>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
|
||||
pub struct XmlSchemaBinding {
|
||||
pub node_kind: XmlNodeKind,
|
||||
pub name: XmlQualifiedName,
|
||||
#[serde(default)]
|
||||
pub repeated: bool,
|
||||
#[serde(default)]
|
||||
pub nillable: bool,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
|
||||
#[serde(rename_all = "snake_case")]
|
||||
pub enum SchemaKind {
|
||||
@@ -72,7 +99,7 @@ impl Schema {
|
||||
mod tests {
|
||||
use std::collections::BTreeMap;
|
||||
|
||||
use super::{Schema, SchemaKind};
|
||||
use super::{Schema, SchemaKind, XmlNodeKind, XmlQualifiedName, XmlSchemaBinding};
|
||||
|
||||
#[test]
|
||||
fn object_schema_exposes_fields() {
|
||||
@@ -175,4 +202,25 @@ mod tests {
|
||||
assert!(yaml.contains("type: object"));
|
||||
assert_eq!(restored, schema);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn xml_schema_binding_roundtrips() {
|
||||
let binding = XmlSchemaBinding {
|
||||
node_kind: XmlNodeKind::Element,
|
||||
name: XmlQualifiedName {
|
||||
local_name: "CreateLeadRequest".to_owned(),
|
||||
namespace_uri: Some("urn:crm".to_owned()),
|
||||
prefix: Some("crm".to_owned()),
|
||||
},
|
||||
repeated: false,
|
||||
nillable: true,
|
||||
};
|
||||
|
||||
let value = serde_json::to_value(&binding).unwrap();
|
||||
let restored: XmlSchemaBinding = serde_json::from_value(value.clone()).unwrap();
|
||||
|
||||
assert_eq!(value["node_kind"], "element");
|
||||
assert_eq!(value["name"]["local_name"], "CreateLeadRequest");
|
||||
assert_eq!(restored, binding);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user