use anyhow::Context;
use tiberius::{Client, Config};
use tokio::net::TcpStream;
use tokio_util::compat::TokioAsyncWriteCompatExt;
use crate::action::{ControlFlow, State};
use crate::parser::BuiltinCommand;
pub async fn run_connect(
mut cmd: BuiltinCommand,
state: &mut State,
) -> Result<ControlFlow, anyhow::Error> {
let name = cmd.args.string("name")?;
cmd.args.done()?;
let ado_string = cmd.input.join("\n");
let config = Config::from_ado_string(&ado_string).context("parsing ADO string: {}")?;
let tcp = TcpStream::connect(config.get_addr())
.await
.context("connecting to SQL Server: {}")?;
tcp.set_nodelay(true)
.context("setting nodelay socket option")?;
let client = Client::connect(config.clone(), tcp.compat_write())
.await
.context("connecting to SQL Server")?;
state.sql_server_clients.insert(name.clone(), client);
Ok(ControlFlow::Continue)
}