Skip to content

Commit

Permalink
feat: #10 ✨ Some cleanup, sub tasks seem to actually start working
Browse files Browse the repository at this point in the history
  • Loading branch information
ddanier committed Apr 24, 2024
1 parent 0b6b52d commit ee1cb2b
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 14 deletions.
10 changes: 10 additions & 0 deletions nur-tests/nurfile
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ let nurcmd = "./../target/release/nur"

def "nur test-env" [] {
std assert (($env.PWD | path join ".nur" "scripts") in $env.NU_LIB_DIRS)
std assert ($env.NUR_VERSION | is-not-empty)
std assert ($env.NUR_TASK_NAME | is-not-empty)
std assert ($env.NUR_TASK_CALL | is-not-empty)
}

def "nur test-config" [] {
Expand Down Expand Up @@ -68,6 +71,13 @@ def "nur test-invalid-executable" [] {
}
}

def "nur do-test-sub-task" [] { print "ok" }
def "nur do-test-sub-task sub" [] { print "sub-ok" }
def "nur test-sub-task" [] {
std assert ((run-nur do-test-sub-task) == "ok")
std assert ((run-nur do-test-sub-task sub) == "sub-ok")
}

# Utils and other commands

def is-windows [] {
Expand Down
41 changes: 32 additions & 9 deletions src/engine.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
use crate::args::{is_safe_taskname, parse_commandline_args, NurArgs};
use crate::errors::{NurError, NurResult};
use crate::names::{
NUR_ENV_NU_LIB_DIRS, NUR_NAME, NUR_VAR_CONFIG_DIR, NUR_VAR_DEFAULT_LIB_DIR,
NUR_VAR_PROJECT_PATH, NUR_VAR_RUN_PATH, NUR_VAR_TASK_NAME,
NUR_ENV_NUR_TASK_CALL, NUR_ENV_NUR_TASK_NAME, NUR_ENV_NUR_VERSION, NUR_ENV_NU_LIB_DIRS,
NUR_NAME, NUR_VAR_CONFIG_DIR, NUR_VAR_DEFAULT_LIB_DIR, NUR_VAR_PROJECT_PATH, NUR_VAR_RUN_PATH,
NUR_VAR_TASK_NAME,
};
use crate::nu_version::NU_VERSION;
use crate::scripts::{get_default_nur_config, get_default_nur_env};
Expand Down Expand Up @@ -89,6 +90,12 @@ impl NurEngine {
Value::string(self.state.lib_dir_path.to_string_lossy(), Span::unknown()),
);

// Set some generic nur ENV
self.engine_state.add_env_var(
NUR_ENV_NUR_VERSION.to_string(),
Value::string(env!("CARGO_PKG_VERSION"), Span::unknown()),
);

// Set config and env paths to .nur versions
self.engine_state
.set_config_path("env-path", self.state.env_path.clone());
Expand Down Expand Up @@ -120,7 +127,7 @@ impl NurEngine {
),
);
if self.state.has_task_call {
// TODO: Remove this! Users should use $env.NUR_TASK_NAME instead ;-)
// TODO: Should we remove this? Will always only include the main task, no sub tasks
nur_record.push(
NUR_VAR_TASK_NAME,
Value::string(self.state.task_call[1].clone(), Span::unknown()), // strip "nur "
Expand Down Expand Up @@ -154,6 +161,21 @@ impl NurEngine {
Ok(())
}

fn _finalise_nur_state(&mut self) {
// Set further state as ENV
self.engine_state.add_env_var(
NUR_ENV_NUR_TASK_CALL.to_string(),
Value::string(self.state.task_call.join(" "), Span::unknown()),
);
if self.task_name.is_some() {
let task_name = self.get_task_name();
self.engine_state.add_env_var(
NUR_ENV_NUR_TASK_NAME.to_string(),
Value::string(task_name, Span::unknown()),
);
}
}

pub(crate) fn parse_args(&mut self) -> NurArgs {
parse_commandline_args(&self.state.args_to_nur.join(" "), &mut self.engine_state)
.unwrap_or_else(|_| std::process::exit(1))
Expand Down Expand Up @@ -187,19 +209,22 @@ impl NurEngine {
self.source(self.state.local_nurfile_path.clone(), PipelineData::empty())?;
}

self._find_task_name();
self._finalise_nur_state();

Ok(())
}

pub(crate) fn find_task_name(&mut self) -> bool {
fn _find_task_name(&mut self) {
if !self.state.has_task_call {
return false;
return;
}

let task_call_length = self.state.task_call.len();

let full_task_name = self.state.task_call[0..2].join(" ");
if !self.has_def(full_task_name) {
return false;
return;
}

let mut i = 2;
Expand All @@ -215,8 +240,6 @@ impl NurEngine {
}

self.task_name = Some(self.state.task_call[0..i].join(" "));

true
}

pub(crate) fn get_task_def(&mut self) -> Option<&dyn Command> {
Expand Down Expand Up @@ -469,7 +492,7 @@ mod tests {
File::create(&nurfile_path).unwrap();

let args = vec![String::from("nur"), String::from("some_task")];
let nur_state = NurState::new(temp_dir_path.clone(), args);
let nur_state = NurState::new(temp_dir_path.clone(), args).unwrap();
let engine_state = init_engine_state(temp_dir_path).unwrap();

NurEngine::new(engine_state, nur_state).unwrap()
Expand Down
4 changes: 2 additions & 2 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,8 @@ fn main() -> Result<ExitCode, miette::ErrReport> {
}
}

// Find full task name
if !nur_engine.find_task_name() {
// Ensure we have a task name
if nur_engine.task_name.is_none() {
return Err(miette::ErrReport::from(NurError::TaskNotFound(
nur_engine.state.task_call[1].clone(),
)));
Expand Down
3 changes: 3 additions & 0 deletions src/names.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ pub(crate) const NUR_CONFIG_ENV_FILENAME: &str = "env.nu";

// $env variable names
pub(crate) const NUR_ENV_NU_LIB_DIRS: &str = "NU_LIB_DIRS";
pub(crate) const NUR_ENV_NUR_VERSION: &str = "NUR_VERSION";
pub(crate) const NUR_ENV_NUR_TASK_CALL: &str = "NUR_TASK_CALL";
pub(crate) const NUR_ENV_NUR_TASK_NAME: &str = "NUR_TASK_NAME";

// $nur variable names
pub(crate) const NUR_VAR_RUN_PATH: &str = "run-path";
Expand Down
6 changes: 3 additions & 3 deletions src/state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ mod tests {
String::from("some_task"),
String::from("task_arg"),
];
let state = NurState::new(temp_dir_path.clone(), args);
let state = NurState::new(temp_dir_path.clone(), args).unwrap();

// Check everything works out
assert_eq!(state.run_path, temp_dir_path);
Expand Down Expand Up @@ -134,7 +134,7 @@ mod tests {
String::from("some_task"),
String::from("task_arg"),
];
let state = NurState::new(temp_dir_path.clone(), args);
let state = NurState::new(temp_dir_path.clone(), args).unwrap();

// Check everything works out
assert_eq!(state.run_path, temp_dir_path);
Expand Down Expand Up @@ -174,7 +174,7 @@ mod tests {

// Setup test
let args = vec![String::from("nur"), String::from("--help")];
let state = NurState::new(temp_dir_path.clone(), args);
let state = NurState::new(temp_dir_path.clone(), args).unwrap();

// Check everything works out
assert_eq!(state.run_path, temp_dir_path);
Expand Down

0 comments on commit ee1cb2b

Please sign in to comment.