#[cfg(test)]
mod tests;
use crate::icp::{IcpCli, IcpCommandError, IcpJsonResponseError, decode_json_response};
use std::path::Path;
use canic_core::{dto::metadata::CanicMetadataResponse, protocol};
use thiserror::Error as ThisError;
const ICP_JSON_OUTPUT: &str = "json";
#[derive(Debug, ThisError)]
pub enum CanicMetadataQueryError {
#[error(transparent)]
Icp(#[from] IcpCommandError),
#[error(transparent)]
Response(#[from] IcpJsonResponseError),
}
pub fn query_canic_metadata_version(
icp: &IcpCli,
canister_id: &str,
candid_path: Option<&Path>,
) -> Result<String, CanicMetadataQueryError> {
let output = icp.canister_query_output_with_candid(
canister_id,
protocol::CANIC_METADATA,
Some(ICP_JSON_OUTPUT),
candid_path,
)?;
parse_canic_metadata_version_response(&output).map_err(Into::into)
}
pub fn parse_canic_metadata_version_response(output: &str) -> Result<String, IcpJsonResponseError> {
let metadata = decode_json_response::<CanicMetadataResponse>(output)?;
Ok(metadata.canic_version)
}