rosrust/rosxmlrpc/
server.rs
1use super::ResponseInfo;
2use std::net::SocketAddr;
3use xml_rpc::{self, rouille, Value};
4
5use super::{Response, ResponseError};
6
7pub struct Server {
8 server: xml_rpc::Server,
9}
10
11impl Default for Server {
12 fn default() -> Self {
13 let mut server = xml_rpc::Server::default();
14 server.set_on_missing(on_missing);
15 Server { server }
16 }
17}
18
19impl Server {
20 #[inline]
21 pub fn register_value<T>(&mut self, name: impl Into<String>, msg: &'static str, handler: T)
22 where
23 T: Fn(xml_rpc::Params) -> Response<Value> + Send + Sync + 'static,
24 {
25 self.server.register_value(name, move |args| {
26 let response = handler(args);
27 let response_info = ResponseInfo::from_response(response, msg);
28 response_info.into()
29 })
30 }
31
32 #[inline]
33 pub fn bind(
34 self,
35 uri: &SocketAddr,
36 ) -> xml_rpc::error::Result<
37 xml_rpc::server::BoundServer<
38 impl Fn(&rouille::Request) -> rouille::Response + Send + Sync + 'static,
39 >,
40 > {
41 self.server.bind(uri)
42 }
43}
44
45#[allow(clippy::needless_pass_by_value)]
46#[inline]
47fn on_missing(_params: xml_rpc::Params) -> xml_rpc::Response {
48 let error_message = ResponseError::Client("Bad method requested".into());
49 let info = ResponseInfo::from_response_error(error_message);
50 info.into()
51}