shameful pile of providencial junk
This commit is contained in:
parent
e188609c18
commit
7c6b9c3b2a
9 changed files with 86 additions and 31 deletions
|
@ -33,7 +33,8 @@ SUBCOMMANDS:
|
||||||
## TODO
|
## TODO
|
||||||
|
|
||||||
- [ ] add support and switch on run/test for strict mode.
|
- [ ] add support and switch on run/test for strict mode.
|
||||||
- [ ] add `--` syntax to run subcommand for parameter piping.
|
- [x] add `-p` flag to run subcommand with parameter piping.
|
||||||
- [ ] flag on push to add automatically
|
- [ ] flag on push to add automatically
|
||||||
- [ ] prevent double includes.
|
- [ ] prevent double includes.
|
||||||
- [ ] flag on init to copy personnal environment
|
- [ ] flag on init to copy personnal environment
|
||||||
|
- [ ] gc subcommand to free cache
|
||||||
|
|
|
@ -9,7 +9,7 @@ pub const FORMAT_CONFIG: &StaticConf = &[
|
||||||
|
|
||||||
pub fn formatted_config() -> String {
|
pub fn formatted_config() -> String {
|
||||||
let middle = FORMAT_CONFIG
|
let middle = FORMAT_CONFIG
|
||||||
.into_iter()
|
.iter()
|
||||||
.map(|(key, value)| format!("{key}: {value}"))
|
.map(|(key, value)| format!("{key}: {value}"))
|
||||||
.collect::<Vec<_>>()
|
.collect::<Vec<_>>()
|
||||||
.join(", ");
|
.join(", ");
|
||||||
|
|
|
@ -31,7 +31,7 @@ fn ends_with_newline(source: String) -> RuleResult {
|
||||||
|
|
||||||
fn function_under_50l(source: String) -> RuleResult {
|
fn function_under_50l(source: String) -> RuleResult {
|
||||||
for character in source.chars() {
|
for character in source.chars() {
|
||||||
let c: char = character;
|
let _c: char = character;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
@ -63,6 +63,7 @@ impl Config {
|
||||||
Self::try_get(&path).or_else(|| path.parent().and_then(Self::get))
|
Self::try_get(&path).or_else(|| path.parent().and_then(Self::get))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get path of the current config file
|
||||||
pub fn get_path(path: &Path) -> Option<PathBuf> {
|
pub fn get_path(path: &Path) -> Option<PathBuf> {
|
||||||
let path = path.to_path_buf().canonicalize().unwrap();
|
let path = path.to_path_buf().canonicalize().unwrap();
|
||||||
Self::try_get_path(&path).or_else(|| path.parent().and_then(Self::get_path))
|
Self::try_get_path(&path).or_else(|| path.parent().and_then(Self::get_path))
|
||||||
|
@ -72,16 +73,28 @@ impl Config {
|
||||||
&self.identifier
|
&self.identifier
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn main_file(&self) -> &str {
|
pub fn main_file(&self) -> String {
|
||||||
&self.main_file
|
Self::try_absolute(self.main_file.clone())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn test_file(&self) -> &str {
|
pub fn test_file(&self) -> String {
|
||||||
&self.test_file
|
Self::try_absolute(self.test_file.clone())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn includes(&self) -> &Vec<String> {
|
fn try_absolute(path: String) -> String {
|
||||||
&self.includes
|
if let Some(conf_path) = Self::get_local_path() {
|
||||||
|
let dir_path = conf_path.parent().unwrap();
|
||||||
|
dir_path.join(path).to_str().unwrap().to_string()
|
||||||
|
} else {
|
||||||
|
path
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn includes(&self) -> Vec<String> {
|
||||||
|
self.includes
|
||||||
|
.iter()
|
||||||
|
.map(|p| Self::try_absolute(p.clone()))
|
||||||
|
.collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn strict_mode(&self) -> bool {
|
pub fn strict_mode(&self) -> bool {
|
||||||
|
|
35
src/main.rs
35
src/main.rs
|
@ -35,8 +35,13 @@ pub enum Commands {
|
||||||
|
|
||||||
/// Runs a set of files or the default target.
|
/// Runs a set of files or the default target.
|
||||||
run {
|
run {
|
||||||
|
// disables fsanitize
|
||||||
|
#[clap(short, long)]
|
||||||
|
disable_sanitize: bool,
|
||||||
/// Files to run.
|
/// Files to run.
|
||||||
files: Vec<String>,
|
files: Vec<String>,
|
||||||
|
#[clap(short, long)]
|
||||||
|
pass: Vec<String>,
|
||||||
},
|
},
|
||||||
|
|
||||||
/// Runs tests contained within a particular test file or the default test file.
|
/// Runs tests contained within a particular test file or the default test file.
|
||||||
|
@ -84,16 +89,17 @@ fn append_includes(list: &mut Vec<String>) {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn compilation_args() -> Vec<String> {
|
fn compilation_args(sanitize: bool) -> Vec<String> {
|
||||||
let mut args = vec![
|
let mut args = vec![
|
||||||
"-Wall".to_string(),
|
"-Wall".to_string(),
|
||||||
"-fsanitize=address".to_string(),
|
|
||||||
"-Wextra".to_string(),
|
"-Wextra".to_string(),
|
||||||
"-std=c99".to_string(),
|
"-std=c99".to_string(),
|
||||||
"-g".to_string(),
|
"-g".to_string(),
|
||||||
"-fsanitize=address".to_string(),
|
"-pedantic".to_string(),
|
||||||
// "-pedantic".to_string(),
|
|
||||||
];
|
];
|
||||||
|
if sanitize {
|
||||||
|
args.push("-fsanitize=address".to_string())
|
||||||
|
}
|
||||||
if Config::get_local_or_default().strict_mode() {
|
if Config::get_local_or_default().strict_mode() {
|
||||||
args.push("-Werror".to_string());
|
args.push("-Werror".to_string());
|
||||||
}
|
}
|
||||||
|
@ -108,13 +114,17 @@ fn main() {
|
||||||
|
|
||||||
Commands::format { files } => check::format(files),
|
Commands::format { files } => check::format(files),
|
||||||
|
|
||||||
Commands::run { mut files } => {
|
Commands::run {
|
||||||
|
disable_sanitize,
|
||||||
|
mut files,
|
||||||
|
pass,
|
||||||
|
} => {
|
||||||
if files.is_empty() {
|
if files.is_empty() {
|
||||||
files.push(Config::get_local_or_default().main_file().to_string());
|
files.push(Config::get_local_or_default().main_file());
|
||||||
}
|
}
|
||||||
append_includes(&mut files);
|
append_includes(&mut files);
|
||||||
let args = compilation_args();
|
let args = compilation_args(!disable_sanitize);
|
||||||
run::main(files, args);
|
run::main(files, args, pass);
|
||||||
}
|
}
|
||||||
|
|
||||||
Commands::test {
|
Commands::test {
|
||||||
|
@ -123,11 +133,12 @@ fn main() {
|
||||||
// tests,
|
// tests,
|
||||||
} => {
|
} => {
|
||||||
if files.is_empty() {
|
if files.is_empty() {
|
||||||
files.push(Config::get_local_or_default().test_file().to_string());
|
files.push(Config::get_local_or_default().test_file());
|
||||||
}
|
}
|
||||||
append_includes(&mut files);
|
let mut includes = vec![];
|
||||||
let args = compilation_args();
|
append_includes(&mut includes);
|
||||||
test::main(capture, files, args)
|
let args = compilation_args(true);
|
||||||
|
test::main(capture, files, includes, args)
|
||||||
}
|
}
|
||||||
Commands::watch { command, files } => {
|
Commands::watch { command, files } => {
|
||||||
let mut files = files.unwrap_or_default();
|
let mut files = files.unwrap_or_default();
|
||||||
|
|
|
@ -3,7 +3,7 @@ use crate::{
|
||||||
utils::{log_failure, log_process},
|
utils::{log_failure, log_process},
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn main(files: Vec<String>, flags: Vec<String>) -> Option<()> {
|
pub fn main(files: Vec<String>, flags: Vec<String>, passed: Vec<String>) -> Option<()> {
|
||||||
let source_file = files.into_iter().map(|f| f.into()).collect();
|
let source_file = files.into_iter().map(|f| f.into()).collect();
|
||||||
log_process("compiling");
|
log_process("compiling");
|
||||||
let mut task = CompileTask::new(source_file);
|
let mut task = CompileTask::new(source_file);
|
||||||
|
@ -19,6 +19,7 @@ pub fn main(files: Vec<String>, flags: Vec<String>) -> Option<()> {
|
||||||
|
|
||||||
log_process("running");
|
log_process("running");
|
||||||
RunTask::new(compiled)
|
RunTask::new(compiled)
|
||||||
|
.with_args(passed)
|
||||||
.run()
|
.run()
|
||||||
.map(Option::from)
|
.map(Option::from)
|
||||||
.unwrap_or_else(|_| {
|
.unwrap_or_else(|_| {
|
||||||
|
|
21
src/tasks.rs
21
src/tasks.rs
|
@ -5,7 +5,8 @@ use std::{
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::utils::{
|
use crate::utils::{
|
||||||
log_command_run, log_failure, log_separator_bottom, log_separator_top, tmp_file_path, Apply,
|
log_command_run, log_failure, log_separator_bottom, log_separator_top, remove_dupes,
|
||||||
|
tmp_file_path, Apply,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct CompileTask {
|
pub struct CompileTask {
|
||||||
|
@ -55,13 +56,18 @@ impl CompileTask {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn compile(&self, sources: Vec<PathBuf>) -> Result<PathBuf, ExitStatus> {
|
pub fn compile(&self, sources: Vec<PathBuf>) -> Result<PathBuf, ExitStatus> {
|
||||||
|
let mut sources = sources
|
||||||
|
.iter()
|
||||||
|
.map(|s| s.to_str().unwrap().to_string())
|
||||||
|
.collect();
|
||||||
|
remove_dupes(&mut sources);
|
||||||
let output_path = tmp_file_path().apply(|o| o.set_extension("b"));
|
let output_path = tmp_file_path().apply(|o| o.set_extension("b"));
|
||||||
let output_path_ref = output_path.to_str().unwrap();
|
let output_path_ref = output_path.to_str().unwrap();
|
||||||
let mut command = Command::new("gcc");
|
let mut command = Command::new("gcc");
|
||||||
command
|
command
|
||||||
.args(["-o", output_path_ref])
|
.args(["-o", output_path_ref])
|
||||||
.args(self.flags.clone())
|
.args(self.flags.clone())
|
||||||
.args(sources.iter().map(|s| s.to_str().unwrap()));
|
.args(sources);
|
||||||
if self.verbose {
|
if self.verbose {
|
||||||
log_command_run(&command);
|
log_command_run(&command);
|
||||||
log_separator_top();
|
log_separator_top();
|
||||||
|
@ -77,6 +83,7 @@ impl CompileTask {
|
||||||
pub struct RunTask {
|
pub struct RunTask {
|
||||||
file: PathBuf,
|
file: PathBuf,
|
||||||
verbose: bool,
|
verbose: bool,
|
||||||
|
args: Vec<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl RunTask {
|
impl RunTask {
|
||||||
|
@ -84,17 +91,23 @@ impl RunTask {
|
||||||
Self {
|
Self {
|
||||||
file,
|
file,
|
||||||
verbose: false,
|
verbose: false,
|
||||||
|
args: vec![],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn with_args(mut self, mut args: Vec<String>) -> Self {
|
||||||
|
self.args.append(&mut args);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
pub fn with_verbose(mut self) -> Self {
|
pub fn with_verbose(mut self) -> Self {
|
||||||
self.verbose = true;
|
self.verbose = true;
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn run(self) -> Result<(), ExitStatus> {
|
pub fn run(self) -> Result<(), ExitStatus> {
|
||||||
let mut command = Command::new("sh");
|
let mut command = Command::new(self.file.to_str().unwrap());
|
||||||
command.args(["-c", self.file.to_str().unwrap()]);
|
command.args(self.args);
|
||||||
if self.verbose {
|
if self.verbose {
|
||||||
log_command_run(&command);
|
log_command_run(&command);
|
||||||
log_separator_top();
|
log_separator_top();
|
||||||
|
|
12
src/test.rs
12
src/test.rs
|
@ -1,13 +1,14 @@
|
||||||
use std::{fs, thread, time::Duration};
|
use std::{fs, path::PathBuf, thread, time::Duration};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
tasks::{CompileTask, GenTask, RunTask},
|
tasks::{CompileTask, GenTask, RunTask},
|
||||||
utils::{log_failure, log_process, log_success},
|
utils::{log_failure, log_process, log_success},
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn main(_capture: bool, files: Vec<String>, args: Vec<String>) {
|
pub fn main(_capture: bool, test_files: Vec<String>, includes: Vec<String>, args: Vec<String>) {
|
||||||
log_process("testing");
|
log_process("testing");
|
||||||
for path in files {
|
let includes: Vec<_> = includes.into_iter().map(PathBuf::from).collect();
|
||||||
|
for path in test_files {
|
||||||
let content = fs::read_to_string(&path).unwrap();
|
let content = fs::read_to_string(&path).unwrap();
|
||||||
let tests = find_tests(content);
|
let tests = find_tests(content);
|
||||||
for test in tests {
|
for test in tests {
|
||||||
|
@ -18,7 +19,10 @@ pub fn main(_capture: bool, files: Vec<String>, args: Vec<String>) {
|
||||||
thread::sleep(Duration::from_millis(100));
|
thread::sleep(Duration::from_millis(100));
|
||||||
|
|
||||||
// compile with all files
|
// compile with all files
|
||||||
let mut task = CompileTask::new(vec![generated_code]);
|
let mut files = vec![generated_code];
|
||||||
|
let mut local_includes = includes.clone();
|
||||||
|
files.append(&mut local_includes);
|
||||||
|
let mut task = CompileTask::new(files);
|
||||||
for flag in args.clone() {
|
for flag in args.clone() {
|
||||||
task = task.with_flag(flag);
|
task = task.with_flag(flag);
|
||||||
}
|
}
|
||||||
|
|
14
src/utils.rs
14
src/utils.rs
|
@ -1,4 +1,4 @@
|
||||||
use std::{fs, path::PathBuf, process::Command};
|
use std::{collections::HashSet, fs, mem::swap, path::PathBuf, process::Command};
|
||||||
|
|
||||||
use chrono::Utc;
|
use chrono::Utc;
|
||||||
use termion::color;
|
use termion::color;
|
||||||
|
@ -97,3 +97,15 @@ pub fn log_error(input: impl AsRef<str>) {
|
||||||
log_pi_prefix();
|
log_pi_prefix();
|
||||||
println!("error: {input}");
|
println!("error: {input}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn remove_dupes(input: &mut Vec<String>) {
|
||||||
|
let mut tmp = vec![];
|
||||||
|
swap(input, &mut tmp);
|
||||||
|
let mut set = HashSet::new();
|
||||||
|
for str in tmp {
|
||||||
|
set.insert(str);
|
||||||
|
}
|
||||||
|
for str in set {
|
||||||
|
input.push(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue