use clap::Parser;
use datafold::{
constants::DEFAULT_HTTP_PORT,
datafold_node::{load_node_config, DataFoldNode},
server::http_server::DataFoldHttpServer,
};
#[derive(Parser, Debug)]
#[command(author, version, about)]
struct Cli {
#[arg(long, default_value_t = DEFAULT_HTTP_PORT)]
port: u16,
#[arg(long)]
schema_service_url: Option<String>,
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut config = load_node_config(None, None)?;
#[allow(unused_mut)]
let mut log_config = datafold::logging::config::LogConfig::from_env().unwrap_or_default();
#[cfg(feature = "aws-backend")]
if let datafold::datafold_node::config::DatabaseConfig::DynamoDb(ref db_config) =
config.database
{
if std::env::var("DATAFOLD_LOG_DYNAMODB_ENABLED").is_err() {
log_config.outputs.dynamodb.enabled = true;
log_config.outputs.dynamodb.table_name = db_config.tables.logs.clone();
log_config.outputs.dynamodb.region = Some(db_config.region.clone());
}
}
if let Err(e) = datafold::logging::LoggingSystem::init_with_config(log_config).await {
eprintln!("Failed to initialize logging system: {}", e);
}
let Cli {
port: http_port,
schema_service_url,
} = Cli::parse();
if let Some(url) = schema_service_url {
config.schema_service_url = Some(url);
}
let node = DataFoldNode::new(config).await?;
let bind_address = format!("0.0.0.0:{}", http_port);
let http_server = DataFoldHttpServer::new(node, &bind_address).await?;
http_server
.run()
.await
.map_err(|e| Box::new(e) as Box<dyn std::error::Error>)
}
#[cfg(test)]
mod tests {
use super::Cli;
use clap::Parser;
use datafold::constants::DEFAULT_HTTP_PORT;
#[test]
fn defaults() {
let cli = Cli::parse_from(["test"]);
assert_eq!(cli.port, DEFAULT_HTTP_PORT);
}
#[test]
fn custom_port() {
let cli = Cli::parse_from(["test", "--port", "8000"]);
assert_eq!(cli.port, 8000);
}
}