diff --git a/CHANGELOG.md b/CHANGELOG.md index eecc6eef..10136c80 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### Added +- **aiken**: enhance `aiken new` - **aiken-lang**: Binary operator are now treated like first-class citizen in expressions. In particular, they can be used as function arguments directly: diff --git a/crates/aiken-project/src/config.rs b/crates/aiken-project/src/config.rs index 1310145f..66ffd41d 100644 --- a/crates/aiken-project/src/config.rs +++ b/crates/aiken-project/src/config.rs @@ -65,7 +65,7 @@ impl Config { owner: "aiken-lang".to_string(), repo: "stdlib".to_string(), }, - version: "main".to_string(), + version: "1.1.0".to_string(), source: Platform::Github, }], } diff --git a/crates/aiken/src/cmd/new.rs b/crates/aiken/src/cmd/new.rs index 4f707a9b..6ddf2ad1 100644 --- a/crates/aiken/src/cmd/new.rs +++ b/crates/aiken/src/cmd/new.rs @@ -19,8 +19,11 @@ pub struct Args { /// Project name name: String, /// Library only - #[clap(long)] + #[clap(long, short)] lib: bool, + /// Empty project + #[clap(long, short)] + empty: bool, } pub fn exec(args: Args) -> miette::Result<()> { @@ -39,10 +42,10 @@ fn create_project(args: Args, package_name: &PackageName) -> miette::Result<()> })?; } - create_lib_folder(&root, package_name)?; + create_lib(&root, package_name, args.empty)?; if !args.lib { - create_validators_folder(&root)?; + create_validators(&root, package_name, args.empty)?; } readme(&root, &package_name.repo)?; @@ -67,6 +70,9 @@ fn print_success_message(package_name: &PackageName) { {cd} {folder} {aiken} check + {aiken} build + + {hint} You may want to update the {stdlib} version in {toml}. "#, s = "successfully" .if_supports_color(Stderr, |s| s.bright_green()) @@ -80,25 +86,73 @@ fn print_success_message(package_name: &PackageName) { .if_supports_color(Stderr, |s| s.bright_blue()), aiken = "aiken" .if_supports_color(Stderr, |s| s.purple()) - .if_supports_color(Stderr, |s| s.bold()) + .if_supports_color(Stderr, |s| s.bold()), + hint = "hint:" + .if_supports_color(Stderr, |s| s.cyan()) + .if_supports_color(Stderr, |s| s.bold()), + stdlib = "stdlib" + .if_supports_color(Stderr, |s| s.purple()) + .if_supports_color(Stderr, |s| s.bold()), + toml = "aiken.toml" + .if_supports_color(Stderr, |s| s.bold()), } ) } -fn create_lib_folder(root: &Path, package_name: &PackageName) -> miette::Result<()> { - let nested_path = root.join("lib").join(&package_name.repo); +fn create_lib(root: &Path, package_name: &PackageName, empty: bool) -> miette::Result<()> { + let lib = root.join("lib").join(&package_name.repo); - fs::create_dir_all(nested_path).into_diagnostic()?; + fs::create_dir_all(&lib).into_diagnostic()?; - Ok(()) + if empty { + return Ok(()); + } + + fs::write( + lib.join("types.ak"), + formatdoc! { + r#" + /// Custom type + pub type Datum {{ + /// A utf8 encoded message + message: ByteArray, + }} + + test sum() {{ + 1 + 1 == 2 + }} + "#, + }, + ) + .into_diagnostic() } -fn create_validators_folder(root: &Path) -> miette::Result<()> { +fn create_validators(root: &Path, package_name: &PackageName, empty: bool) -> miette::Result<()> { let validators = root.join("validators"); - fs::create_dir_all(validators).into_diagnostic()?; + fs::create_dir_all(&validators).into_diagnostic()?; - Ok(()) + if empty { + return Ok(()); + } + + fs::write( + validators.join("hello.ak"), + formatdoc! { + r#" + use aiken/transaction.{{ScriptContext}} + use {name}/types + + validator {{ + fn spend(datum: types.Datum, _redeemer: Data, _ctx: ScriptContext) -> Bool {{ + datum.message == "Hello World!" + }} + }} + "#, + name = package_name.repo + }, + ) + .into_diagnostic() } fn readme(root: &Path, project_name: &str) -> miette::Result<()> {