use serde_generate as serdegen;
use serde_reflection::Registry;
use std::path::PathBuf;
use structopt::{clap::arg_enum, StructOpt};
arg_enum! {
#[derive(Debug, StructOpt)]
enum Language {
Rust,
Go,
}
}
#[derive(Debug, StructOpt)]
#[structopt(name = "Aptos SDK Builder", about = "Generate boilerplate Aptos SDKs")]
struct Options {
abi_directories: Vec<PathBuf>,
#[structopt(long, possible_values = &Language::variants(), case_insensitive = true, default_value = "Python3")]
language: Language,
#[structopt(long)]
target_source_dir: Option<PathBuf>,
#[structopt(long)]
with_aptos_types: Option<PathBuf>,
#[structopt(long)]
module_name: Option<String>,
#[structopt(long)]
serde_package_name: Option<String>,
#[structopt(long, default_value = "0.1.0")]
aptos_version_number: String,
#[structopt(long)]
package_name: Option<String>,
}
fn main() {
let options = Options::from_args();
let abis = aptos_sdk_builder::read_abis(&options.abi_directories)
.expect("Failed to read ABI in directory");
let install_dir = match options.target_source_dir {
None => {
let stdout = std::io::stdout();
let mut out = stdout.lock();
match options.language {
Language::Rust => {
aptos_sdk_builder::rust::output(&mut out, &abis, false)
.unwrap()
}
Language::Go => {
aptos_sdk_builder::golang::output(
&mut out,
options.serde_package_name.clone(),
options.package_name.clone(),
options.module_name.as_deref().unwrap_or("main").to_string(),
&abis,
)
.unwrap();
}
}
return;
}
Some(dir) => dir,
};
if let Some(registry_file) = options.with_aptos_types {
let installer: Box<dyn serdegen::SourceInstaller<Error = Box<dyn std::error::Error>>> =
match options.language {
Language::Rust => Box::new(serdegen::rust::Installer::new(install_dir.clone())),
Language::Go => Box::new(serdegen::golang::Installer::new(
install_dir.clone(),
options.serde_package_name.clone(),
)),
};
let content =
std::fs::read_to_string(registry_file).expect("registry file must be readable");
let mut registry = serde_yaml::from_str::<Registry>(content.as_str()).unwrap();
if let Language::Rust = options.language {
aptos_sdk_builder::rust::replace_keywords(&mut registry)
}
let (package_name, _package_path) = match options.language {
Language::Rust => (
if options.aptos_version_number == "0.1.0" {
"aptos-types".to_string()
} else {
format!("aptos-types:{}", options.aptos_version_number)
},
vec!["aptos-types"],
),
Language::Go => ("aptostypes".to_string(), vec!["aptostypes"]),
};
let config = serdegen::CodeGeneratorConfig::new(package_name)
.with_encodings(vec![serdegen::Encoding::Bcs]);
installer.install_module(&config, ®istry).unwrap();
}
let installer: Box<dyn aptos_sdk_builder::SourceInstaller<Error = Box<dyn std::error::Error>>> =
match options.language {
Language::Rust => Box::new(aptos_sdk_builder::rust::Installer::new(
install_dir,
options.aptos_version_number,
)),
Language::Go => Box::new(aptos_sdk_builder::golang::Installer::new(
install_dir,
options.serde_package_name,
options.package_name,
)),
};
if let Some(name) = options.module_name {
installer
.install_transaction_builders(&name, abis.as_slice())
.unwrap();
}
}