diff --git a/src/compiler.rs b/src/compiler.rs index 4a9d0d5..d01f30a 100644 --- a/src/compiler.rs +++ b/src/compiler.rs @@ -5,6 +5,7 @@ use std::{collections::HashSet, fs, path}; use crate::config::Config; +#[derive(Default)] pub struct Compiler { config: Config, path: String, diff --git a/src/config.rs b/src/config.rs index 747fe8c..cf0d948 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,18 +1,18 @@ use serde::Deserialize; -#[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, Default)] pub struct Config { pub general: General, pub build: Build, } -#[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, Default)] pub struct General { pub target: String, pub main: String, } -#[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, Default)] pub struct Build { pub build_dir: String, pub cc: String, diff --git a/src/init.rs b/src/init.rs new file mode 100644 index 0000000..e30ade0 --- /dev/null +++ b/src/init.rs @@ -0,0 +1,7 @@ +use std::{fs, path}; + +pub fn init(path: String) { + println!("Creating {}", path); + fs::create_dir(path.clone()).unwrap(); + fs::create_dir(path::Path::new(&path).join("src")).unwrap(); +} diff --git a/src/lib.rs b/src/lib.rs index 0831c01..2bc434b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,2 +1,3 @@ pub mod compiler; pub mod config; +pub mod init; diff --git a/src/main.rs b/src/main.rs index ed9bf9e..b1616fa 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,7 +4,7 @@ use std::{ path::{self, Path}, }; -use boat::{compiler::Compiler, config::Config}; +use boat::{compiler::Compiler, config::Config, init}; use clap::Parser; #[derive(clap::ValueEnum, Clone, Debug)] @@ -12,6 +12,7 @@ enum Modes { Build, Clean, Run, + Init, } impl Display for Modes { @@ -20,6 +21,7 @@ impl Display for Modes { Modes::Build => f.write_str("build"), // "build".to_string(), Modes::Clean => f.write_str("clean"), Modes::Run => f.write_str("run"), + Modes::Init => f.write_str("init"), } } } @@ -52,20 +54,27 @@ pub struct Args { fn main() { let args = Args::parse(); - let conf_path = path::Path::new(args.path.as_str()).join("c_config.toml"); - let contents = fs::read_to_string(conf_path.clone()) - .unwrap_or_else(|_| panic!("Couldn't read {}", conf_path.to_str().unwrap())); + let mut compiler = Compiler::default(); - let config: Config = toml::from_str(&contents).unwrap(); + if let Modes::Init = args.mode { + } else { + let conf_path = path::Path::new(args.path.as_str()).join("c_config.toml"); - // println!("{:?}", config); + let contents = fs::read_to_string(conf_path.clone()) + .unwrap_or_else(|_| panic!("Couldn't read {}", conf_path.to_str().unwrap())); - let (src_files, header_files) = get_file_list(&args.path).expect("Error while readig files"); + let config: Config = toml::from_str(&contents).unwrap(); - // println!("{:?}, {:?}", src_files, header_files); + // println!("{:?}", config); - let mut compiler = Compiler::new(config, args.path, src_files, header_files); + let (src_files, header_files) = + get_file_list(&args.path).expect("Error while readig files"); + + // println!("{:?}, {:?}", src_files, header_files); + + compiler = Compiler::new(config, args.path.clone(), src_files, header_files); + } match args.mode { Modes::Build => { @@ -78,6 +87,9 @@ fn main() { compiler.compile(args.verbose); compiler.run(); } + Modes::Init => { + init::init(args.path); + } } }