1use std::{env, process::exit};
2
3use quickfix::{
4 Acceptor, Application, ConnectionHandler, FileMessageStoreFactory, FixSocketServerKind,
5 Initiator, LogFactory, QuickFixError, SessionSettings, StdLogger,
6};
7
8use crate::{command_exec::FixShell, fix_app::MyApplication};
9
10mod command_exec;
11mod command_parser;
12mod fix_app;
13
14fn main() -> Result<(), QuickFixError> {
15 let args: Vec<_> = env::args().collect();
16 let (Some(connect_mode), Some(config_file)) = (args.get(1), args.get(2)) else {
17 eprintln!(
18 "Bad program usage: {} [acceptor|initiator] <config_file>",
19 args[0]
20 );
21 exit(1);
22 };
23
24 println!(">> Creating resources");
25 let settings = SessionSettings::try_from_path(config_file)?;
26 let store_factory = FileMessageStoreFactory::try_new(&settings)?;
27 let log_factory = LogFactory::try_new(&StdLogger::Stdout)?;
28 let callbacks = MyApplication::new();
29 let app = Application::try_new(&callbacks)?;
30
31 match connect_mode.as_str() {
32 "initiator" => server_loop(Initiator::try_new(
33 &settings,
34 &app,
35 &store_factory,
36 &log_factory,
37 FixSocketServerKind::SingleThreaded,
38 )?),
39 "acceptor" => server_loop(Acceptor::try_new(
40 &settings,
41 &app,
42 &store_factory,
43 &log_factory,
44 FixSocketServerKind::SingleThreaded,
45 )?),
46 _ => {
47 eprintln!("Invalid connection mode");
48 exit(1);
49 }
50 }?;
51
52 println!(">> All cleared. Bye !");
53 Ok(())
54}
55
56fn server_loop<C: ConnectionHandler>(mut connection_handler: C) -> Result<(), QuickFixError> {
57 println!(">> connection handler START");
58 connection_handler.start()?;
59
60 let mut shell = FixShell::new();
61 shell.repl(&mut connection_handler);
62
63 println!(">> connection handler STOP");
64 connection_handler.stop()?;
65
66 Ok(())
67}