109 lines
3.0 KiB
Rust
109 lines
3.0 KiB
Rust
use xmltree::{Element, XMLNode};
|
|
|
|
use crate::{
|
|
UpnpObject, UpnpObjectType, UpnpXml, actions::Argument, state_variables::StateVariable,
|
|
};
|
|
|
|
impl UpnpXml for Argument {
|
|
fn to_xml_element(&self) -> Element {
|
|
let mut parent = Element::new("argumentList");
|
|
|
|
if self.is_in() && self.is_out() {
|
|
// InOut → deux arguments
|
|
parent.children.push(XMLNode::Element(make_argument_elem(
|
|
self.get_name(),
|
|
"in",
|
|
self.state_variable().get_name(),
|
|
)));
|
|
parent.children.push(XMLNode::Element(make_argument_elem(
|
|
self.get_name(),
|
|
"out",
|
|
self.state_variable().get_name(),
|
|
)));
|
|
} else {
|
|
// Cas simple
|
|
let direction = if self.is_in() { "in" } else { "out" };
|
|
parent.children.push(XMLNode::Element(make_argument_elem(
|
|
self.get_name(),
|
|
direction,
|
|
self.state_variable().get_name(),
|
|
)));
|
|
}
|
|
|
|
parent
|
|
}
|
|
}
|
|
|
|
impl UpnpObject for Argument {
|
|
fn as_upnp_object_type(&self) -> &UpnpObjectType {
|
|
return &self.object;
|
|
}
|
|
}
|
|
|
|
impl Argument {
|
|
fn new(name: String, state_variable: StateVariable) -> Self {
|
|
Self {
|
|
object: UpnpObjectType {
|
|
name,
|
|
object_type: "Argument".to_string(),
|
|
},
|
|
state_variable,
|
|
is_in: false,
|
|
is_out: false,
|
|
}
|
|
}
|
|
|
|
pub fn new_in(name: String, state_variable: StateVariable) -> Self {
|
|
let mut arg = Self::new(name, state_variable);
|
|
arg.is_in = true;
|
|
arg
|
|
}
|
|
|
|
pub fn new_out(name: String, state_variable: StateVariable) -> Self {
|
|
let mut arg = Self::new(name, state_variable);
|
|
arg.is_out = true;
|
|
arg
|
|
}
|
|
|
|
pub fn new_in_out(name: String, state_variable: StateVariable) -> Self {
|
|
let mut arg = Self::new(name, state_variable);
|
|
arg.is_in = true;
|
|
arg.is_out = true;
|
|
arg
|
|
}
|
|
|
|
pub fn state_variable(&self) -> &StateVariable {
|
|
&self.state_variable
|
|
}
|
|
|
|
pub fn is_in(&self) -> bool {
|
|
self.is_in
|
|
}
|
|
|
|
pub fn is_out(&self) -> bool {
|
|
self.is_out
|
|
}
|
|
}
|
|
|
|
/// Fabrique un <argument> complet avec ses sous-éléments
|
|
fn make_argument_elem(name: &str, direction: &str, state_var_name: &str) -> Element {
|
|
let mut arg = Element::new("argument");
|
|
|
|
let mut name_elem = Element::new("name");
|
|
name_elem.children.push(XMLNode::Text(name.to_string()));
|
|
|
|
let mut dir_elem = Element::new("direction");
|
|
dir_elem.children.push(XMLNode::Text(direction.to_string()));
|
|
|
|
let mut rel_elem = Element::new("relatedStateVariable");
|
|
rel_elem
|
|
.children
|
|
.push(XMLNode::Text(state_var_name.to_string()));
|
|
|
|
arg.children.push(XMLNode::Element(name_elem));
|
|
arg.children.push(XMLNode::Element(dir_elem));
|
|
arg.children.push(XMLNode::Element(rel_elem));
|
|
|
|
arg
|
|
}
|