use crate::{CodeInfo, Error};
use jam_program_blob::{ConventionalMetadata as Metadata, CrateInfo};
use jam_std_common::{RpcClient, Service};
use jam_types::{Hash, ServiceId};
use jsonrpsee::ws_client::WsClient;
use scale::{Compact, Decode};
pub async fn query_service(
rpc: &WsClient,
head: Hash,
id: ServiceId,
) -> Result<(Service, CodeInfo<CrateInfo>), anyhow::Error> {
use CodeInfo::*;
let req = rpc.service_info(head, id).await?.ok_or(Error::ServiceNotFound)?;
let info = Service::decode(&mut &req[..]).map_err(Error::InvalidServiceEncoding)?;
let maybe_code = rpc.service_preimage(head, id, info.code_hash.0).await?;
let meta = match maybe_code {
None => CodeNotProvided(info.code_hash),
Some(code) => match <(Compact<u32>, Metadata)>::decode(&mut &code[..]).ok().map(|x| x.1) {
None => Undefined(info.code_hash),
Some(Metadata::Info(crate_info)) => Known(crate_info),
},
};
Ok((info, meta))
}