use js_sys::Uint8Array;
use k256::ecdsa::VerifyingKey;
use wasm_bindgen::prelude::*;
use crate::signer::{JsSigner, JsSignerFn};
use crate::GrpcClientBuilderError;
mod grpc_client;
use grpc_client::GrpcClient;
#[wasm_bindgen]
pub struct GrpcClientBuilder {
inner: crate::GrpcClientBuilder,
}
#[wasm_bindgen]
impl GrpcClientBuilder {
#[wasm_bindgen(js_name = "withUrl")]
pub fn with_url(self, url: String) -> Self {
Self {
inner: self.inner.url(url),
}
}
#[wasm_bindgen(js_name = withPubkeyAndSigner)]
pub fn with_pubkey_and_signer(
self,
account_pubkey: Uint8Array,
signer_fn: JsSignerFn,
) -> Result<Self, GrpcClientBuilderError> {
let signer = JsSigner::new(signer_fn);
let account_pubkey = VerifyingKey::try_from(account_pubkey.to_vec().as_slice())
.map_err(|_| GrpcClientBuilderError::InvalidPublicKey)?;
Ok(Self {
inner: self.inner.pubkey_and_signer(account_pubkey, signer),
})
}
#[wasm_bindgen(js_name = withMetadata)]
pub fn with_metadata(self, key: String, value: String) -> Self {
Self {
inner: self.inner.metadata(&key, &value),
}
}
#[wasm_bindgen(js_name = withMetadataBin)]
pub fn with_metadata_bin(self, key: String, value: Uint8Array) -> Self {
Self {
inner: self.inner.metadata_bin(&key, &value.to_vec()),
}
}
pub fn build(self) -> Result<GrpcClient, GrpcClientBuilderError> {
Ok(self.inner.build()?.into())
}
}
impl From<crate::GrpcClientBuilder> for GrpcClientBuilder {
fn from(inner: crate::GrpcClientBuilder) -> Self {
Self { inner }
}
}