use std::env;
use std::io::{self, Write};
use std::sync::Arc;
use sqry_daemon::{
DaemonConfig, EmptyGraphBuilder, IpcServer, RebuildDispatcher, SocketConfig, WorkspaceBuilder,
WorkspaceManager,
};
use tokio::io::AsyncReadExt;
use tokio_util::sync::CancellationToken;
#[tokio::main]
async fn main() {
tracing_subscriber::fmt()
.with_env_filter(
tracing_subscriber::EnvFilter::try_from_env("SQRYD_TEST_LOG")
.unwrap_or_else(|_| tracing_subscriber::EnvFilter::new("warn")),
)
.compact()
.with_writer(std::io::stderr)
.init();
let socket_path = env::var("SQRYD_TEST_SOCKET").expect("SQRYD_TEST_SOCKET must be set");
let mut config = DaemonConfig {
socket: SocketConfig {
path: Some(socket_path.into()),
pipe_name: None,
},
..DaemonConfig::default()
};
config
.apply_env_overrides()
.expect("apply_env_overrides in sqryd-test-server");
let config = Arc::new(config);
let manager = WorkspaceManager::new_without_reaper(Arc::clone(&config));
let plugins = Arc::new(sqry_plugin_registry::create_plugin_manager());
let dispatcher = RebuildDispatcher::new(
Arc::clone(&manager),
Arc::clone(&config),
Arc::clone(&plugins),
);
let tool_executor = Arc::new(sqry_core::query::executor::QueryExecutor::new());
let shutdown = CancellationToken::new();
let server = IpcServer::bind(
Arc::clone(&config),
Arc::clone(&manager),
dispatcher,
Arc::new(EmptyGraphBuilder) as Arc<dyn WorkspaceBuilder>,
tool_executor,
shutdown.clone(),
)
.await
.expect("IpcServer::bind");
let stdout = io::stdout();
writeln!(&mut stdout.lock(), "READY").expect("write READY to stdout");
stdout.lock().flush().expect("flush READY");
let server_handle = tokio::spawn(server.run());
let mut stdin = tokio::io::stdin();
let mut buf = [0u8; 1];
loop {
match stdin.read(&mut buf).await {
Ok(0) | Err(_) => break,
Ok(_) => {} }
}
shutdown.cancel();
let _ = tokio::time::timeout(std::time::Duration::from_secs(3), server_handle).await;
}