Skip to content

Commit 98a6c4c

Browse files
committed
Switch command line parsing from clap to config
1 parent 7d42e6d commit 98a6c4c

3 files changed

Lines changed: 70 additions & 140 deletions

File tree

Cargo.lock

Lines changed: 38 additions & 124 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ jsonpath-rust = "0.7"
1515
tokio = { version = "1.49.0", features = ["full"] }
1616
async-trait = "0.1.89"
1717
futures = "0.3.31"
18-
clap = { version = "4.5.54", features = ["derive"] }
18+
config = { version = "0.15.19", default-features = false, features = ["toml"] }
1919

2020
[dev-dependencies]
2121
tempfile = "3.10.1"

src/main.rs

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use async_trait::async_trait;
2-
use clap::Parser;
2+
use config::{Config, Environment};
3+
use serde::Deserialize;
34
use futures::stream;
45
use pgwire::api::Type;
56
use pgwire::api::auth::StartupHandler;
@@ -25,19 +26,22 @@ use crate::db::DB;
2526
use crate::parser as argus_parser;
2627
use crate::query::{Statement, execute_plan};
2728

28-
/// ArgusDB Server
29-
#[derive(Parser, Debug)]
30-
#[command(author, version, about, long_about = None)]
31-
struct Args {
32-
/// Host to bind to
33-
#[arg(short, long, default_value = "127.0.0.1")]
29+
#[derive(Debug, Deserialize)]
30+
struct Settings {
31+
#[serde(default = "default_host")]
3432
host: String,
35-
36-
/// Port to bind to
37-
#[arg(short, long, default_value_t = 5432)]
33+
#[serde(default = "default_port")]
3834
port: u16,
3935
}
4036

37+
fn default_host() -> String {
38+
"127.0.0.1".to_string()
39+
}
40+
41+
fn default_port() -> u16 {
42+
5432
43+
}
44+
4145
pub struct ArgusHandler {
4246
db: Arc<Mutex<DB>>,
4347
}
@@ -60,7 +64,11 @@ impl SimpleQueryHandler for ArgusHandler {
6064
Ok(s) => s,
6165
Err(e) => {
6266
return Ok(vec![Response::Error(Box::new(
63-
PgWireError::ApiError(Box::new(std::io::Error::other(e))).into(),
67+
PgWireError::ApiError(Box::new(std::io::Error::new(
68+
std::io::ErrorKind::Other,
69+
e,
70+
)))
71+
.into(),
6472
))]);
6573
}
6674
};
@@ -82,7 +90,7 @@ impl SimpleQueryHandler for ArgusHandler {
8290
)))])
8391
}
8492
Statement::Select(plan) => {
85-
let iter = execute_plan(plan, &db);
93+
let iter = execute_plan(plan, &*db);
8694

8795
let mut rows_data = Vec::new();
8896
for (_, doc) in iter {
@@ -99,7 +107,9 @@ impl SimpleQueryHandler for ArgusHandler {
99107
let obj = first.as_object().unwrap();
100108
let fields: Vec<FieldInfo> = obj
101109
.keys()
102-
.map(|k| FieldInfo::new(k.clone(), None, None, Type::JSON, FieldFormat::Text))
110+
.map(|k| {
111+
FieldInfo::new(k.clone().into(), None, None, Type::JSON, FieldFormat::Text)
112+
})
103113
.collect();
104114
let fields = Arc::new(fields);
105115

@@ -150,12 +160,18 @@ impl PgWireServerHandlers for ArgusProcessor {
150160

151161
#[tokio::main]
152162
async fn main() {
153-
let args = Args::parse();
163+
let settings = Config::builder()
164+
.add_source(Environment::with_prefix("ARGUS"))
165+
.build()
166+
.unwrap()
167+
.try_deserialize::<Settings>()
168+
.unwrap();
169+
154170
let db = Arc::new(Mutex::new(DB::new("argus_data")));
155171
let handler = Arc::new(ArgusHandler::new(db));
156172
let processor = Arc::new(ArgusProcessor { handler });
157173

158-
let server_addr = format!("{}:{}", args.host, args.port);
174+
let server_addr = format!("{}:{}", settings.host, settings.port);
159175
let listener = TcpListener::bind(&server_addr).await.unwrap();
160176
println!("ArgusDB server listening on {}", server_addr);
161177

0 commit comments

Comments
 (0)