1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
/* -------------------------------------------------------------------------- *\
 *        Apache 2.0 License Copyright © 2022-2023 The Aurae Authors          *
 *                                                                            *
 *                +--------------------------------------------+              *
 *                |   █████╗ ██╗   ██╗██████╗  █████╗ ███████╗ |              *
 *                |  ██╔══██╗██║   ██║██╔══██╗██╔══██╗██╔════╝ |              *
 *                |  ███████║██║   ██║██████╔╝███████║█████╗   |              *
 *                |  ██╔══██║██║   ██║██╔══██╗██╔══██║██╔══╝   |              *
 *                |  ██║  ██║╚██████╔╝██║  ██║██║  ██║███████╗ |              *
 *                |  ╚═╝  ╚═╝ ╚═════╝ ╚═╝  ╚═╝╚═╝  ╚═╝╚══════╝ |              *
 *                +--------------------------------------------+              *
 *                                                                            *
 *                         Distributed Systems Runtime                        *
 *                                                                            *
 * -------------------------------------------------------------------------- *
 *                                                                            *
 *   Licensed under the Apache License, Version 2.0 (the "License");          *
 *   you may not use this file except in compliance with the License.         *
 *   You may obtain a copy of the License at                                  *
 *                                                                            *
 *       http://www.apache.org/licenses/LICENSE-2.0                           *
 *                                                                            *
 *   Unless required by applicable law or agreed to in writing, software      *
 *   distributed under the License is distributed on an "AS IS" BASIS,        *
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
 *   See the License for the specific language governing permissions and      *
 *   limitations under the License.                                           *
 *                                                                            *
\* -------------------------------------------------------------------------- */
use proto::discovery::{
    discovery_service_server, DiscoverRequest, DiscoverResponse,
};
use thiserror::Error;
use tonic::{Request, Response, Status};
use tracing::error;
pub(crate) type Result<T> = std::result::Result<T, DiscoveryServiceError>;
const VERSION: Option<&str> = option_env!("CARGO_PKG_VERSION");
#[derive(Debug, Error)]
pub(crate) enum DiscoveryServiceError {
    #[error(transparent)]
    IO(#[from] std::io::Error),
}
impl From<DiscoveryServiceError> for Status {
    fn from(err: DiscoveryServiceError) -> Self {
        let msg = err.to_string();
        error!("{msg}");
        match err {
            DiscoveryServiceError::IO(_) => Status::internal(msg),
        }
    }
}
#[derive(Debug, Clone)]
pub struct DiscoveryService {}
impl DiscoveryService {
    pub fn new() -> Self {
        DiscoveryService {}
    }
    #[tracing::instrument(skip(self))]
    fn discover(&self, request: DiscoverRequest) -> Result<DiscoverResponse> {
        Ok(DiscoverResponse {
            healthy: true,
            version: VERSION.unwrap_or("unknown").into(),
        })
    }
}
#[tonic::async_trait]
impl discovery_service_server::DiscoveryService for DiscoveryService {
    async fn discover(
        &self,
        request: Request<DiscoverRequest>,
    ) -> std::result::Result<Response<DiscoverResponse>, Status> {
        let request = request.into_inner();
        Ok(Response::new(self.discover(request)?))
    }
}
#[cfg(test)]
mod tests {
    use proto::discovery::DiscoverRequest;
    use crate::discovery::{DiscoveryService, VERSION};
    #[test]
    fn test_discover() {
        let resp = DiscoveryService::new().discover(DiscoverRequest {});
        assert!(resp.is_ok());
        let resp = resp.unwrap();
        assert!(resp.healthy);
        assert_eq!(resp.version, VERSION.expect("valid version"));
    }
}