1
use anyhow::Result;
2
use std::fs;
3
use std::path::Path;
4
use tera::{Context, Tera};
5

            
6
pub fn init_project(project_name: &str, dir: Option<String>) -> Result<()> {
7
    let pwd = std::env::current_dir()?;
8
    let project_path = if let Some(dir) = dir {
9
        let dir = Path::new(&dir);
10
        if dir.is_relative() {
11
            pwd.join(dir).to_path_buf()
12
        } else {
13
            dir.to_path_buf()
14
        }
15
    } else {
16
        pwd.join(project_name).to_path_buf()
17
    };
18
    if project_path.exists() {
19
        return Err(anyhow::anyhow!("Project already exists"));
20
    }
21

            
22
    // Create src directory
23
    fs::create_dir_all(project_path.join("src"))?;
24

            
25
    // Initialize Tera
26
    let mut tera = Tera::default();
27
    tera.add_raw_templates(vec![
28
        ("Cargo.toml", CARGO_TEMPLATE),
29
        ("src/main.rs", MAIN_TEMPLATE),
30
        ("README.md", README_TEMPLATE),
31
    ])?;
32

            
33
    // Create context
34
    let mut context = Context::new();
35
    context.insert("project_name", project_name);
36

            
37
    // Render and write templates
38
    for (template_name, file_name) in &[
39
        ("Cargo.toml", "Cargo.toml"),
40
        ("src/main.rs", "src/main.rs"),
41
        ("README.md", "README.md"),
42
    ] {
43
        let content = tera.render(template_name, &context)?;
44
        fs::write(format!("{}/{}", project_name, file_name), content)?;
45
    }
46

            
47
    println!("Project '{}' initialized successfully!", project_name);
48
    Ok(())
49
}
50

            
51
const CARGO_TEMPLATE: &str = r#"
52
[package]
53
name = "{{ project_name }}"
54
version = "0.1.0"
55
edition = "2021"
56

            
57
[package.metadata.zkprogram]
58
input_order = ["Public"]
59

            
60

            
61
[workspace]
62

            
63
[dependencies]
64
risc0-zkvm = {git = "https://github.com/anagrambuild/risc0", branch = "v1.0.1-bonsai-fix", default-features = false, features = ["std"]}
65

            
66
[dependencies.sha2]
67
git = "https://github.com/risc0/RustCrypto-hashes"
68
tag = "sha2-v0.10.6-risczero.0"
69
"#;
70

            
71
const MAIN_TEMPLATE: &str = r#"
72
use risc0_zkvm::{guest::{env, sha::Impl},sha::{Digest, Sha256}};
73

            
74
fn main() {
75
    let mut input_1 = Vec::new();
76
    env::read_slice(&mut input_1);
77
    let digest = Impl::hash_bytes(&[input_1.as_slice()]);
78
    env::commit_slice(digest.as_bytes());
79
}
80
"#;
81

            
82
const README_TEMPLATE: &str = r#"
83
# {{ project_name }}
84

            
85
This is a Bonsol zkprogram, built on risc0
86
"#;