fix_repl/
main.rs

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}