soroban_cli/commands/contract/
inspect.rs1use crate::xdr;
2use clap::{command, Parser};
3use soroban_spec_tools::contract;
4use std::{fmt::Debug, path::PathBuf};
5use tracing::debug;
6
7use super::SpecOutput;
8use crate::{config::locator, wasm};
9
10#[derive(Parser, Debug, Clone)]
11#[group(skip)]
12pub struct Cmd {
13 #[command(flatten)]
14 wasm: wasm::Args,
15 #[arg(long, default_value = "docs")]
17 output: SpecOutput,
18
19 #[clap(flatten)]
20 locator: locator::Args,
21}
22
23#[derive(thiserror::Error, Debug)]
24pub enum Error {
25 #[error(transparent)]
26 Wasm(#[from] wasm::Error),
27 #[error("missing spec for {0:?}")]
28 MissingSpec(PathBuf),
29 #[error(transparent)]
30 Xdr(#[from] xdr::Error),
31 #[error(transparent)]
32 Spec(#[from] contract::Error),
33}
34
35impl Cmd {
36 pub fn run(&self) -> Result<(), Error> {
37 let wasm = self.wasm.parse()?;
38 debug!("File: {}", self.wasm.wasm.to_string_lossy());
39 let output = match self.output {
40 SpecOutput::XdrBase64 => wasm
41 .spec_base64
42 .clone()
43 .ok_or_else(|| Error::MissingSpec(self.wasm.wasm.clone()))?,
44 SpecOutput::XdrBase64Array => wasm.spec_as_json_array()?,
45 SpecOutput::Docs => wasm.to_string(),
46 };
47 println!("{output}");
48 Ok(())
49 }
50}