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}