mirror of
https://github.com/ProvableHQ/leo.git
synced 2024-12-23 18:21:38 +03:00
implement leo example command for lottery, tictactoe, token (#2514)
* implement leo example command for lottery, tictactoe, token * remove unused cli arg * update github actions * update github actions
This commit is contained in:
parent
af1f7f96fb
commit
013809c076
15
.github/workflows/release.yml
vendored
15
.github/workflows/release.yml
vendored
@ -169,11 +169,13 @@ jobs:
|
||||
mkdir tempdir
|
||||
mv target/aarch64-apple-darwin/release/leo tempdir
|
||||
cd tempdir
|
||||
zip -r leo-${{ steps.get_version.outputs.version }}-aarch64-apple-darwin.zip leo
|
||||
zip -r leo.zip leo
|
||||
cp leo.zip leo-${{ steps.get_version.outputs.version }}-aarch64-apple-darwin.zip
|
||||
cd ..
|
||||
mv tempdir/leo-${{ steps.get_version.outputs.version }}-aarch64-apple-darwin.zip .
|
||||
mv tempdir/leo.zip .
|
||||
|
||||
- name: Release
|
||||
- name: Release macos m1 version
|
||||
uses: softprops/action-gh-release@v1
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
with:
|
||||
@ -182,6 +184,15 @@ jobs:
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Release leo.zip
|
||||
uses: softprops/action-gh-release@v1
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
with:
|
||||
files: |
|
||||
leo.zip
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
windows:
|
||||
name: Windows
|
||||
runs-on: windows-latest
|
||||
|
@ -171,4 +171,11 @@ create_messages!(
|
||||
msg: format!("Failed to parse the seed string for account.\nSnarkVM Error: {error}"),
|
||||
help: None,
|
||||
}
|
||||
|
||||
@backtraced
|
||||
failed_to_write_file {
|
||||
args: (error: impl Display),
|
||||
msg: format!("Failed to write file.\nIO Error: {error}"),
|
||||
help: None,
|
||||
}
|
||||
);
|
||||
|
@ -34,9 +34,6 @@ pub struct CLI {
|
||||
#[clap(subcommand)]
|
||||
command: Commands,
|
||||
|
||||
#[clap(help = "Custom Aleo PM backend URL", env = "APM_URL")]
|
||||
api: Option<String>,
|
||||
|
||||
#[clap(long, global = true, help = "Optional path to Leo program root folder")]
|
||||
path: Option<PathBuf>,
|
||||
}
|
||||
@ -54,6 +51,11 @@ enum Commands {
|
||||
#[clap(flatten)]
|
||||
command: New,
|
||||
},
|
||||
#[clap(about = "Create a new Leo example package in a new directory")]
|
||||
Example {
|
||||
#[clap(subcommand)]
|
||||
command: Example,
|
||||
},
|
||||
#[clap(about = "Compile the current package as a program")]
|
||||
Build {
|
||||
#[clap(flatten)]
|
||||
@ -125,6 +127,7 @@ pub fn run_with_args(cli: CLI) -> Result<()> {
|
||||
command.try_execute(context)
|
||||
}
|
||||
Commands::Clean { command } => command.try_execute(context),
|
||||
Commands::Example { command } => command.try_execute(context),
|
||||
Commands::Run { command } => command.try_execute(context),
|
||||
Commands::Execute { command } => command.try_execute(context),
|
||||
Commands::Update { command } => command.try_execute(context),
|
||||
|
102
leo/cli/commands/example.rs
Normal file
102
leo/cli/commands/example.rs
Normal file
@ -0,0 +1,102 @@
|
||||
// Copyright (C) 2019-2023 Aleo Systems Inc.
|
||||
// This file is part of the Leo library.
|
||||
|
||||
// The Leo library is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// The Leo library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with the Leo library. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
use super::*;
|
||||
|
||||
use std::fs;
|
||||
|
||||
/// The example programs that can be generated.
|
||||
#[derive(Parser, Debug)]
|
||||
pub enum Example {
|
||||
#[clap(name = "lottery", about = "A public lottery program")]
|
||||
Lottery,
|
||||
#[clap(name = "tictactoe", about = "A standard tic-tac-toe game program")]
|
||||
TicTacToe,
|
||||
#[clap(name = "token", about = "A transparent & shielded custom token program")]
|
||||
Token,
|
||||
}
|
||||
|
||||
impl Command for Example {
|
||||
type Input = <New as Command>::Output;
|
||||
type Output = ();
|
||||
|
||||
fn prelude(&self, context: Context) -> Result<Self::Input> {
|
||||
// Run leo new EXAMPLE_NAME
|
||||
(New { name: self.name() }).execute(context)
|
||||
}
|
||||
|
||||
fn apply(self, context: Context, _: Self::Input) -> Result<Self::Output>
|
||||
where
|
||||
Self: Sized,
|
||||
{
|
||||
let package_dir = context.dir()?;
|
||||
|
||||
// Write the main file.
|
||||
let main_file_path = package_dir.join("src").join("main.leo");
|
||||
fs::write(main_file_path, self.main_file_string()).map_err(CliError::failed_to_write_file)?;
|
||||
|
||||
// Write the input file.
|
||||
let input_file_path = package_dir.join("inputs").join("input.in");
|
||||
fs::write(input_file_path, self.input_file_string()).map_err(CliError::failed_to_write_file)?;
|
||||
|
||||
// Write the README file.
|
||||
let readme_file_path = package_dir.join("README.md");
|
||||
let readme_file_path_string = readme_file_path.display().to_string();
|
||||
fs::write(readme_file_path, self.readme_file_string()).map_err(CliError::failed_to_write_file)?;
|
||||
|
||||
tracing::info!(
|
||||
"🚀 To run the '{}' program follow the instructions at {}",
|
||||
self.name().bold(),
|
||||
readme_file_path_string
|
||||
);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl Example {
|
||||
fn name(&self) -> String {
|
||||
match self {
|
||||
Example::Lottery => "lottery".to_string(),
|
||||
Example::TicTacToe => "tictactoe".to_string(),
|
||||
Example::Token => "token".to_string(),
|
||||
}
|
||||
}
|
||||
|
||||
fn main_file_string(&self) -> String {
|
||||
match self {
|
||||
Self::Lottery => include_str!("../../../examples/lottery/src/main.leo").to_string(),
|
||||
Self::TicTacToe => include_str!("../../../examples/tictactoe/src/main.leo").to_string(),
|
||||
Self::Token => include_str!("../../../examples/token/src/main.leo").to_string(),
|
||||
}
|
||||
}
|
||||
|
||||
fn input_file_string(&self) -> String {
|
||||
match self {
|
||||
Self::Lottery => include_str!("../../../examples/lottery/inputs/lottery.in").to_string(),
|
||||
Self::TicTacToe => include_str!("../../../examples/tictactoe/inputs/tictactoe.in").to_string(),
|
||||
Self::Token => include_str!("../../../examples/token/inputs/token.in").to_string(),
|
||||
}
|
||||
}
|
||||
|
||||
fn readme_file_string(&self) -> String {
|
||||
match self {
|
||||
Self::Lottery => include_str!("../../../examples/lottery/README.md").to_string(),
|
||||
Self::TicTacToe => include_str!("../../../examples/tictactoe/README.md").to_string(),
|
||||
Self::Token => include_str!("../../../examples/token/README.md").to_string(),
|
||||
}
|
||||
}
|
||||
}
|
@ -23,6 +23,9 @@ pub use build::Build;
|
||||
pub mod clean;
|
||||
pub use clean::Clean;
|
||||
|
||||
pub mod example;
|
||||
pub use example::Example;
|
||||
|
||||
pub mod execute;
|
||||
pub use execute::Execute;
|
||||
|
||||
|
@ -22,7 +22,7 @@ use snarkvm::{cli::New as SnarkVMNew, file::AleoFile};
|
||||
#[derive(Parser, Debug)]
|
||||
pub struct New {
|
||||
#[clap(name = "NAME", help = "Set package name")]
|
||||
name: String,
|
||||
pub(crate) name: String,
|
||||
}
|
||||
|
||||
impl Command for New {
|
||||
@ -43,8 +43,6 @@ impl Command for New {
|
||||
SnarkVMNew::try_parse_from([SNARKVM_COMMAND, &self.name]).map_err(CliError::failed_to_parse_new)?;
|
||||
let result = command.parse().map_err(CliError::failed_to_execute_new)?;
|
||||
|
||||
// todo: modify the readme file to recommend building with `leo build`.
|
||||
|
||||
// Log the output of the `aleo new` command.
|
||||
tracing::info!("{}", result);
|
||||
|
||||
|
42
leo/package/src/example.rs
Normal file
42
leo/package/src/example.rs
Normal file
@ -0,0 +1,42 @@
|
||||
// Copyright (C) 2019-2023 Aleo Systems Inc.
|
||||
// This file is part of the Leo library.
|
||||
|
||||
// The Leo library is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// The Leo library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with the Leo library. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
use super::*;
|
||||
|
||||
/// The example programs that can be generated.
|
||||
pub enum Example {
|
||||
Lottery,
|
||||
TicTacToe,
|
||||
Token,
|
||||
}
|
||||
|
||||
impl Example {
|
||||
pub fn main_file_string(&self, package_name: &str) -> String {
|
||||
match self {
|
||||
Self::Lottery => include_str!("../../examples/lottery/src/main.leo").to_string(),
|
||||
Self::TicTacToe => include_str!("../../examples/tic_tac_toe/src/main.leo").to_string(),
|
||||
Self::Token => include_str!("../../examples/token/src/main.leo").to_string(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn input_file_string(&self, package_name: &str) -> String {
|
||||
match self {
|
||||
Self::Lottery => include_str!("../../examples/lottery/inputs/input.in").to_string(),
|
||||
Self::TicTacToe => include_str!("../../examples/tic_tac_toe/inputs/input.in").to_string(),
|
||||
Self::Token => include_str!("../../examples/token/inputs/input.in").to_string(),
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user