123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- use anchor_cli::rust_template::ProgramTemplate;
- use anchor_cli::{create_files, Files};
- use anchor_lang_idl::types::{IdlArrayLen, IdlGenericArg, IdlType};
- use anyhow::Result;
- use std::path::{Path, PathBuf};
- use crate::templates::component::create_component_template_simple;
- use crate::templates::program::{create_program_template_multiple, create_program_template_single};
- use crate::templates::system::create_system_template_simple;
- use crate::templates::workspace::{
- cargo_toml, cargo_toml_with_serde, workspace_manifest, xargo_toml,
- };
- /// Create a component from the given name.
- pub fn create_component(name: &str) -> Result<()> {
- let program_path = Path::new("programs-ecs/components").join(name);
- let common_files = vec![
- (
- PathBuf::from("Cargo.toml".to_string()),
- workspace_manifest().to_string(),
- ),
- (program_path.join("Cargo.toml"), cargo_toml(name)),
- (program_path.join("Xargo.toml"), xargo_toml().to_string()),
- ] as Files;
- let template_files = create_component_template_simple(name, &program_path);
- anchor_cli::create_files(&[common_files, template_files].concat())
- }
- /// Create a system from the given name.
- pub(crate) fn create_system(name: &str) -> Result<()> {
- let program_path = Path::new("programs-ecs/systems").join(name);
- let common_files = vec![
- (
- PathBuf::from("Cargo.toml".to_string()),
- workspace_manifest().to_string(),
- ),
- (program_path.join("Cargo.toml"), cargo_toml_with_serde(name)),
- (program_path.join("Xargo.toml"), xargo_toml().to_string()),
- ] as Files;
- let template_files = create_system_template_simple(name, &program_path);
- anchor_cli::create_files(&[common_files, template_files].concat())
- }
- /// Create an anchor program
- pub fn create_program(name: &str, template: ProgramTemplate) -> Result<()> {
- let program_path = Path::new("programs").join(name);
- let common_files = vec![
- ("Cargo.toml".into(), workspace_manifest()),
- (program_path.join("Cargo.toml"), cargo_toml(name)),
- (program_path.join("Xargo.toml"), xargo_toml().into()),
- ];
- let template_files = match template {
- ProgramTemplate::Single => create_program_template_single(name, &program_path),
- ProgramTemplate::Multiple => create_program_template_multiple(name, &program_path),
- };
- create_files(&[common_files, template_files].concat())
- }
- pub fn registry_account() -> &'static str {
- r#"
- {
- "pubkey": "EHLkWwAT9oebVv9ht3mtqrvHhRVMKrt54tF3MfHTey2K",
- "account": {
- "lamports": 1002240,
- "data": [
- "L65u9ri2/NoCAAAAAAAAAA==",
- "base64"
- ],
- "owner": "WorLD15A7CrDwLcLy4fRqtaTb9fbd8o8iqiEMUDse2n",
- "executable": false,
- "rentEpoch": 18446744073709551615,
- "space": 16
- }
- }
- "#
- }
- /// Map Idl type to rust type
- pub fn convert_idl_type_to_str(ty: &IdlType) -> String {
- match ty {
- IdlType::Bool => "bool".into(),
- IdlType::U8 => "u8".into(),
- IdlType::I8 => "i8".into(),
- IdlType::U16 => "u16".into(),
- IdlType::I16 => "i16".into(),
- IdlType::U32 => "u32".into(),
- IdlType::I32 => "i32".into(),
- IdlType::F32 => "f32".into(),
- IdlType::U64 => "u64".into(),
- IdlType::I64 => "i64".into(),
- IdlType::F64 => "f64".into(),
- IdlType::U128 => "u128".into(),
- IdlType::I128 => "i128".into(),
- IdlType::U256 => "u256".into(),
- IdlType::I256 => "i256".into(),
- IdlType::Bytes => "bytes".into(),
- IdlType::String => "String".into(),
- IdlType::Pubkey => "Pubkey".into(),
- IdlType::Option(ty) => format!("Option<{}>", convert_idl_type_to_str(ty)),
- IdlType::Vec(ty) => format!("Vec<{}>", convert_idl_type_to_str(ty)),
- IdlType::Array(ty, len) => format!(
- "[{}; {}]",
- convert_idl_type_to_str(ty),
- match len {
- IdlArrayLen::Generic(len) => len.into(),
- IdlArrayLen::Value(len) => len.to_string(),
- }
- ),
- IdlType::Defined { name, generics } => generics
- .iter()
- .map(|generic| match generic {
- IdlGenericArg::Type { ty } => convert_idl_type_to_str(ty),
- IdlGenericArg::Const { value } => value.into(),
- })
- .reduce(|mut acc, cur| {
- if !acc.is_empty() {
- acc.push(',');
- }
- acc.push_str(&cur);
- acc
- })
- .map(|generics| format!("{name}<{generics}>"))
- .unwrap_or(name.into()),
- IdlType::Generic(ty) => ty.into(),
- _ => unimplemented!("{ty:?}"),
- }
- }
|