use std::fs;
use std::path;
use clap::Clap;
use shelly::config::{Config, SupportedLanguage, Target};
use shelly::elixir;
#[derive(Clap)]
#[clap(version = "1.0", author = "Alex M. <alex41290@gmail.com>")]
struct Opts {
#[clap(default_value = ".")]
path: String,
#[clap(short, long)]
shell: bool,
#[clap(short, long)]
target: Option<String>,
#[clap(short, long)]
config: Option<String>,
}
fn main() {
let default_config = fs::read_to_string("./src/templates/shelly.yml").unwrap();
let opts: Opts = Opts::parse();
let config_file = if let Some(cfg) = opts.config {
fs::read_to_string(cfg)
} else {
let home_path = path::PathBuf::from(std::env::var("HOME").unwrap());
let path = home_path.join(".config").join("shelly");
if path.clone().join("shelly.yml").as_path().exists() {
fs::read_to_string(path.clone().join("shelly.yml"))
} else {
let _ = fs::create_dir_all(path.clone());
let _ = fs::write(path.join("shelly.yml"), default_config.clone());
Ok(default_config)
}
}
.unwrap();
let config: Config = serde_yaml::from_str(config_file.as_str()).unwrap();
println!("{:#?}", config);
let target_name = if let Some(t) = opts.target {
t
} else {
config.default_target
};
let target = config.targets.get(&target_name).unwrap();
let Target { language, deps } = target;
match language {
SupportedLanguage::elixir => {
elixir::write_project(opts.path, deps.clone()).unwrap();
elixir::run(opts.shell).unwrap();
}
SupportedLanguage::node => {
panic!("Language not supported yet");
}
SupportedLanguage::rust => {
panic!("Language not supported yet");
}
}
}