1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
//! command `new`
use crate::result::Result;
use std::process::{self, Command};
use structopt::StructOpt;

const ORG: &str = "https://github.com/gear-dapps/";
const GIT_SUFFIX: &str = ".git";
const TEMPLATES: &[&str] = &[
    "concert",
    "crowdsale-ico",
    "dao",
    "dao-light",
    "dutch-auction",
    "escrow",
    "feeds",
    "fungible-token",
    "gear-feeds-channel",
    "lottery",
    "multisig-wallet",
    "nft-pixelboard",
    "non-fungible-token",
    "ping",
    "RMRK",
    "rock-paper-scissors",
    "staking",
    "supply-chain",
    "swap",
];

/// Create a new gear program
#[derive(Debug, StructOpt)]
pub struct New {
    /// Create gear program from templates
    pub template: Option<String>,
}

impl New {
    fn template(name: &str) -> String {
        ORG.to_string() + name + GIT_SUFFIX
    }

    fn help() {
        println!("Available templates:\n\t{}", TEMPLATES.join("\n\t"));
    }

    /// run command new
    pub async fn exec(&self) -> Result<()> {
        if let Some(template) = &self.template {
            if TEMPLATES.contains(&template.as_ref()) {
                if !Command::new("git")
                    .args(&["clone", &Self::template(template)])
                    .status()?
                    .success()
                {
                    process::exit(1);
                }
            } else {
                crate::template::create(template)?;
            }

            println!("Successfully created {}!", template);
        } else {
            Self::help();
        }

        Ok(())
    }
}