pub trait Handler: Send + Sync {
fn initialize(
&self,
) -> impl std::future::Future<
Output = Result<crate::message::InitializeResult, crate::message::ErrorCode>,
> + Send;
fn sign(
&self,
params: crate::message::SignParams,
) -> impl std::future::Future<
Output = Result<crate::message::SignResult, crate::message::ErrorCode>,
> + Send;
}
pub async fn run(handler: impl Handler) -> Result<(), crate::error::Error> {
let stdin = tokio::io::stdin();
let stdout = tokio::io::stdout();
let mut reader = crate::codec::framed_read(stdin);
let mut writer = crate::codec::framed_write(stdout);
loop {
let request: crate::message::Request = match crate::codec::recv_message(&mut reader).await {
Ok(req) => req,
Err(crate::error::Error::ProcessExited) => break,
Err(e) => return Err(e),
};
let id = request.id();
let response = match request {
crate::message::Request::Initialize { .. } => crate::message::Response::initialize(
id,
handler
.initialize()
.await
.map_err(crate::message::ErrorPayload::from),
),
crate::message::Request::Sign { params, .. } => crate::message::Response::sign(
id,
handler
.sign(params)
.await
.map_err(crate::message::ErrorPayload::from),
),
};
crate::codec::send_message(&mut writer, &response).await?;
}
Ok(())
}