soroban_cli/commands/contract/
inspect.rs

1use 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    /// Output just XDR in base64
16    #[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}