feat: add soap core domain model

This commit is contained in:
a.tolmachev
2026-04-06 21:27:19 +03:00
parent 45ea011b7f
commit 31fbdfdc02
19 changed files with 353 additions and 28 deletions
+1 -1
View File
@@ -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};
+49 -1
View File
@@ -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);
}
}