memdatabase 0.1.0

In-memory database
Documentation
use core::net::SocketAddr;

use std::env;
use std::process::ExitCode;

use log::error;

use tonic::transport::{server::Router, Server};
use tonic::Status;

use memdatabase::memdatabase::v1::memory_database_service_server::MemoryDatabaseServiceServer;

use memdatabase::chan::btree::svc::chan_svc_new_default;

const LISTEN_ADDR_DEFAULT: &str = "0.0.0.0:50051";

async fn sub() -> Result<(), Status> {
    let mem_svc = chan_svc_new_default().await;
    let mem_svr: MemoryDatabaseServiceServer<_> = MemoryDatabaseServiceServer::new(mem_svc);

    let mut server: Server = Server::builder();
    let router: Router<_> = server.add_service(mem_svr);

    let listen_addr: String = env::var("ENV_LISTEN_ADDR")
        .ok()
        .unwrap_or_else(|| LISTEN_ADDR_DEFAULT.into());
    let sa: SocketAddr = str::parse(listen_addr.as_str())
        .map_err(|e| Status::invalid_argument(format!("invalid listen addr: {e}")))?;

    router
        .serve(sa)
        .await
        .map_err(|e| Status::internal(format!("unable to listen: {e}")))?;
    Ok(())
}

#[tokio::main]
async fn main() -> ExitCode {
    sub().await.map(|_| ExitCode::SUCCESS).unwrap_or_else(|e| {
        error!("{e}");
        ExitCode::FAILURE
    })
}