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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
use super::codec::Encode;
use bytes::{BufMut, BytesMut};
use std::sync::Arc;
#[derive(Debug, Clone, PartialEq)]
pub struct XmlSchema {
db_name: String,
owner: String,
collection: String,
}
impl XmlSchema {
pub(crate) fn new(db_name: impl ToString, owner: impl ToString, collection: impl ToString) -> Self {
Self {
db_name: db_name.to_string(),
owner: owner.to_string(),
collection: collection.to_string(),
}
}
pub fn db_name(&self) -> &str {
&self.db_name
}
pub fn owner(&self) -> &str {
&self.owner
}
pub fn collection(&self) -> &str {
&self.collection
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct XmlData {
data: String,
schema: Option<Arc<XmlSchema>>,
}
impl XmlData {
pub fn new(data: impl ToString) -> Self {
Self {
data: data.to_string(),
schema: None,
}
}
pub(crate) fn set_schema(&mut self, schema: Arc<XmlSchema>) {
self.schema = Some(schema);
}
pub fn schema(&self) -> Option<&XmlSchema> {
self.schema.as_ref().map(|s| &**s)
}
pub fn into_string(self) -> String {
self.data
}
}
impl ToString for XmlData {
fn to_string(&self) -> String {
self.data.to_string()
}
}
impl AsRef<str> for XmlData {
fn as_ref(&self) -> &str {
self.data.as_ref()
}
}
impl Encode<BytesMut> for XmlData {
fn encode(self, dst: &mut BytesMut) -> crate::Result<()> {
dst.put_u8(0);
dst.put_u64_le(0xfffffffffffffffe as u64);
dst.put_u32_le(2 * self.data.encode_utf16().count() as u32);
for chr in self.data.encode_utf16() {
dst.put_u16_le(chr);
}
dst.put_u32_le(0);
Ok(())
}
}