aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeerserverDE <himbeerserverde@gmail.com>2022-11-04 22:32:34 +0100
committerHimbeerserverDE <himbeerserverde@gmail.com>2022-11-04 22:32:34 +0100
commit8c6af6b348a4cec414a9a0327d6b0debf29fd59d (patch)
tree7f0773bb30e5e00dde21acd1b283ea9a9b9c415e
parent9f222ddf03fde0432f8f1477914a82de8e82736a (diff)
request stringification: accept all serde::Serialize implementor
-rw-r--r--src/lib.rs27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/lib.rs b/src/lib.rs
index b6bc1c6..49b7250 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -99,6 +99,33 @@ pub fn request_to_string(name: &str, args: Vec<Value>) -> Result<String> {
Ok(String::from_utf8(writer.into_inner()).map_err(error::EncodingError::from)?)
}
+pub fn request_to_str<T>(name: &str, args: Vec<T>) -> Result<String>
+where
+ T: serde::Serialize,
+{
+ let mut writer = Writer::new(Vec::new());
+
+ writer
+ .write(br#"<?xml version="1.0" encoding="utf-8"?>"#)
+ .map_err(error::EncodingError::from)?;
+
+ writer.write_start_tag(b"methodCall")?;
+ writer.write_tag(b"methodName", name)?;
+
+ writer.write_start_tag(b"params")?;
+
+ for value in args {
+ writer.write_start_tag(b"param")?;
+ value.serialize(ValueSerializer::new(&mut writer))?;
+ writer.write_end_tag(b"param")?;
+ }
+
+ writer.write_end_tag(b"params")?;
+ writer.write_end_tag(b"methodCall")?;
+
+ Ok(String::from_utf8(writer.into_inner()).map_err(error::EncodingError::from)?)
+}
+
pub fn value_from_str(input: &str) -> Result<Value> {
let mut reader = Reader::from_str(input);
reader.expand_empty_elements(true);