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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
use clap::*;
use move_package::source_package::layout::SourcePackageLayout;
use std::{
fmt::Display,
fs::create_dir_all,
io::Write,
path::{Path, PathBuf},
};
pub const MOVE_STDLIB_PACKAGE_NAME: &str = "MoveStdlib";
pub const MOVE_STDLIB_PACKAGE_PATH: &str = "{ \
git = \"https://github.com/move-language/move.git\", \
subdir = \"language/move-stdlib\", rev = \"main\" \
}";
pub const MOVE_STDLIB_ADDR_NAME: &str = "std";
pub const MOVE_STDLIB_ADDR_VALUE: &str = "0x1";
#[derive(Parser)]
#[clap(name = "new")]
pub struct New {
pub name: String,
}
impl New {
pub fn execute_with_defaults(self, path: Option<PathBuf>) -> anyhow::Result<()> {
self.execute(
path,
"0.0.0",
[(MOVE_STDLIB_PACKAGE_NAME, MOVE_STDLIB_PACKAGE_PATH)],
[(MOVE_STDLIB_ADDR_NAME, MOVE_STDLIB_ADDR_VALUE)],
"",
)
}
pub fn execute(
self,
path: Option<PathBuf>,
version: &str,
deps: impl IntoIterator<Item = (impl Display, impl Display)>,
addrs: impl IntoIterator<Item = (impl Display, impl Display)>,
custom: &str,
) -> anyhow::Result<()> {
let Self { name } = self;
let p: PathBuf;
let path: &Path = match path {
Some(path) => {
p = path;
&p
}
None => Path::new(&name),
};
create_dir_all(path.join(SourcePackageLayout::Sources.path()))?;
let mut w = std::fs::File::create(path.join(SourcePackageLayout::Manifest.path()))?;
writeln!(
&mut w,
"[package]
name = \"{name}\"
version = \"{version}\"
[dependencies]"
)?;
for (dep_name, dep_val) in deps {
writeln!(w, "{dep_name} = {dep_val}")?;
}
writeln!(
w,
"
[addresses]"
)?;
for (addr_name, addr_val) in addrs {
writeln!(w, "{addr_name} = \"{addr_val}\"")?;
}
if !custom.is_empty() {
writeln!(w, "{}", custom)?;
}
Ok(())
}
}