gosh_remote/
server.rs

1// [[file:../remote.note::77b43c27][77b43c27]]
2use crate::common::*;
3use std::fmt::Debug;
4use std::net::{SocketAddr, ToSocketAddrs};
5// 77b43c27 ends here
6
7// [[file:../remote.note::0b562a75][0b562a75]]
8use crate::get_free_tcp_address;
9
10/// A server for molecule computations allows interaction with RESTful
11/// web services.
12pub struct Server {
13    pub address: SocketAddr,
14}
15
16/// Construct `Server` struct
17impl Server {
18    /// Create a `Server` binding to `addr`.
19    pub fn bind(addr: impl ToSocketAddrs + Debug) -> Self {
20        let addrs: Vec<_> = addr.to_socket_addrs().expect("bad address").collect();
21        assert!(addrs.len() > 0, "invalid server address: {addr:?}");
22        Self { address: addrs[0] }
23    }
24
25    /// Create a `Server` binding to a free available address automatically.
26    pub fn try_bind_auto() -> Result<Self> {
27        let address = get_free_tcp_address().ok_or(format_err!("no free tcp addr"))?;
28        Ok(Self { address })
29    }
30}
31// 0b562a75 ends here