11use async_trait:: async_trait;
2- use clap:: Parser ;
2+ use config:: { Config , Environment } ;
3+ use serde:: Deserialize ;
34use futures:: stream;
45use pgwire:: api:: Type ;
56use pgwire:: api:: auth:: StartupHandler ;
@@ -25,19 +26,22 @@ use crate::db::DB;
2526use crate :: parser as argus_parser;
2627use 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+
4145pub 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]
152162async 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