1use crate::{
2 container::ContractError, CustomTypeSet, DeployedContractsContainer, DEPLOY_SUBCOMMAND
3};
4use anyhow::Result;
5use clap::ArgMatches;
6use odra::{host::HostEnv, prelude::OdraError};
7use thiserror::Error;
8
9use super::OdraCommand;
10
11pub(crate) struct DeployCmd {
15 pub script: Box<dyn DeployScript>
16}
17
18impl OdraCommand for DeployCmd {
19 fn name(&self) -> &str {
20 DEPLOY_SUBCOMMAND
21 }
22
23 fn run(&self, env: &HostEnv, _args: &ArgMatches, _types: &CustomTypeSet) -> Result<()> {
24 let mut container = DeployedContractsContainer::new()?;
25 self.script.deploy(env, &mut container)?;
26 Ok(())
27 }
28}
29
30pub trait DeployScript {
35 fn deploy(
36 &self,
37 env: &HostEnv,
38 container: &mut DeployedContractsContainer
39 ) -> core::result::Result<(), DeployError>;
40}
41
42#[derive(Debug, Error)]
44pub enum DeployError {
45 #[error("Deploy error: {message}")]
46 OdraError { message: String },
47 #[error("Contract read error: {0}")]
48 ContractReadError(#[from] ContractError)
49}
50
51impl From<OdraError> for DeployError {
52 fn from(err: OdraError) -> Self {
53 DeployError::OdraError {
54 message: format!("{:?}", err)
55 }
56 }
57}