use crate::ServiceDef;
use anyhow::Result;
use proc_macro2::TokenStream;
use quote::{format_ident, quote};
pub fn generate_client_stub(service: &ServiceDef) -> Result<TokenStream> {
let client_name = format_ident!("{}Client", service.service_name);
let package = &service.package;
let interface_id = service.interface_id_expr();
let methods: Vec<TokenStream> = service
.methods
.iter()
.map(|method| {
let method_name = format_ident!("{}", method.method_name_snake());
let method_id = method.method_id_expr();
let input_type = method.input_type_path(package);
let output_type = method.output_type_path(package);
let comment = method.comment.as_ref().map(|c| {
let doc = format!(" {}", c);
quote! { #[doc = #doc] }
});
quote! {
#comment
pub async fn #method_name(&self, request: #input_type) -> anyhow::Result<#output_type> {
self.client.call_proto(#interface_id, #method_id, &request).await
}
}
})
.collect();
Ok(quote! {
#[derive(Clone)]
pub struct #client_name {
client: synapse_sdk::SynClient,
}
impl #client_name {
pub fn new(client: synapse_sdk::SynClient) -> Self {
Self { client }
}
#(#methods)*
}
})
}