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,
};
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())
}
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())
}
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
}
}
"#
}
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:?}"),
}
}