indradb 2.1.0

A graph database server
extern crate clap;

mod cli;

use std::error::Error;
use std::net::ToSocketAddrs;
use std::path::Path;
use std::sync::Arc;

use crate::cli::CliDatastoreArgs;

use indradb_proto as proto;
use tokio::net::TcpListener;

#[tokio::main]
pub async fn main() -> Result<(), Box<dyn Error>> {
    let args = cli::parse_cli_args();

    let addr = args.addr.to_socket_addrs()?.next().unwrap();
    let listener = TcpListener::bind(addr).await?;
    let binding = listener.local_addr()?;
    println!("grpc://{}", binding);

    match args.datastore_args {
        CliDatastoreArgs::Rocksdb { path, max_open_files } => {
            let datastore = indradb::RocksdbDatastore::new(&path, Some(max_open_files))
                .expect("Expected to be able to create the RocksDB datastore");

            proto::run_server(Arc::new(datastore), listener).await?;
            Ok(())
        }
        CliDatastoreArgs::Sled { path, sled_config } => {
            let datastore = sled_config
                .open(&path)
                .expect("Expected to be able to create the Sled datastore");

            proto::run_server(Arc::new(datastore), listener).await?;
            Ok(())
        }
        CliDatastoreArgs::Memory { path: None } => {
            let datastore = indradb::MemoryDatastore::default();
            proto::run_server(Arc::new(datastore), listener).await?;
            Ok(())
        }
        CliDatastoreArgs::Memory { path: Some(path) } => {
            let datastore = if Path::new(path.as_os_str()).exists() {
                Arc::new(indradb::MemoryDatastore::read(path)?)
            } else {
                Arc::new(indradb::MemoryDatastore::create(path)?)
            };

            proto::run_server(datastore.clone(), listener).await?;
            Ok(())
        }
    }
}