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"));
}
}