use anyhow::{Result, bail};
use tracing::info;
use crate::{
cfg::config::{Config, ToLoginKeys},
client::client::Connection,
models::{
common::{BasicHeaderSegment, Builder},
data_fromat::PDUWithData,
login::{
common::Stage,
request::{LoginRequest, LoginRequestBuilder},
response::LoginResponse,
},
},
};
pub async fn login_plain(
conn: &Connection,
cfg: &Config,
isid: [u8; 6],
) -> Result<PDUWithData<LoginResponse>> {
let header = LoginRequestBuilder::new(isid, 0)
.transit()
.csg(Stage::Operational)
.nsg(Stage::FullFeature)
.versions(
cfg.login.negotiation.version_min,
cfg.login.negotiation.version_max,
);
let mut builder: PDUWithData<LoginRequest> = PDUWithData::from_header(header.header);
for key in cfg.to_login_keys().into_iter() {
builder.append_data(key.into_bytes());
}
info!("{:?}", builder.header);
let itt = builder.header.get_initiator_task_tag();
conn.send_request(itt, builder).await?;
match conn.read_response::<LoginResponse>(itt).await {
Ok(rsp) => Ok(rsp),
Err(other) => bail!("got unexpected PDU: {:?}", other.to_string()),
}
}