New unset command

This commit is contained in:
sagie gur ari 2020-05-04 07:23:12 +00:00
parent 4bd6bf1ec7
commit a5457e636a
13 changed files with 183 additions and 12 deletions

View file

@ -3,6 +3,7 @@
### v0.3.4
* \[Breaking Change\] Runtime - REPL mode doesn't stop due to crashes from user commands #103
* New unset command.
* New array_contains command.
* New map_contains_value command.
* New map_contains_key command.

View file

@ -137,6 +137,7 @@
* [std::var::GetByName (get_by_name)](#std__var__GetByName)
* [std::var::Set (set)](#std__var__Set)
* [std::var::SetByName (set_by_name)](#std__var__SetByName)
* [std::var::Unset (unset)](#std__var__Unset)
<a name="std__Echo"></a>
@ -5019,7 +5020,7 @@ set
<a name="std__var__SetByName"></a>
## std::var::SetByName
```sh
var = set_by_name name value
var = set_by_name name [value]
```
This command sets the variable value based on the variable name.<br>
@ -5032,7 +5033,7 @@ However, it allows for a dynamic variable name.
#### Parameters
* The variable name.
* The new variable value.
* The new variable value, if not provided, the variable will be unset.
#### Return Value
@ -5053,6 +5054,49 @@ assert_eq ${value} test
#### Aliases:
set_by_name
<a name="std__var__Unset"></a>
## std::var::Unset
```sh
unset [names]*
```
Undefines all the variable names provided.
#### Parameters
A list of variable names to undefine.
#### Return Value
None
#### Examples
```sh
var = set 1
defined = is_defined var
assert ${defined}
unset var
defined = is_defined var
assert_false ${defined}
```
#### Source:
```sh
for scope::unset::name in ${scope::unset::arguments}
set_by_name ${scope::unset::name}
end
```
#### Aliases:
unset
### License
Developed by Sagie Gur-Ari and licensed under the
[Apache 2](https://github.com/sagiegurari/duckscript/blob/master/LICENSE) open source license.

View file

@ -2,6 +2,7 @@ mod get_all_var_names;
mod get_by_name;
pub(crate) mod set;
mod set_by_name;
mod unset;
use crate::utils::pckg;
use duckscript::types::command::Commands;
@ -16,6 +17,7 @@ pub(crate) fn load(commands: &mut Commands, parent: &str) -> Result<(), ScriptEr
commands.set(get_by_name::create(&package))?;
commands.set(set::create(&package))?;
commands.set(set_by_name::create(&package))?;
commands.set(unset::create(&package)?)?;
Ok(())
}

View file

@ -1,5 +1,5 @@
```sh
var = set_by_name name value
var = set_by_name name [value]
```
This command sets the variable value based on the variable name.<br>
@ -12,7 +12,7 @@ However, it allows for a dynamic variable name.
#### Parameters
* The variable name.
* The new variable value.
* The new variable value, if not provided, the variable will be unset.
#### Return Value

View file

@ -43,12 +43,18 @@ impl Command for CommandImpl {
_commands: &mut Commands,
_line: usize,
) -> CommandResult {
if arguments.len() < 2 {
CommandResult::Error("Missing variable name and value.".to_string())
if arguments.is_empty() {
CommandResult::Error("Missing variable name.".to_string())
} else {
variables.insert(arguments[0].clone(), arguments[1].clone());
let output = if arguments.len() > 1 {
variables.insert(arguments[0].clone(), arguments[1].clone());
Some(arguments[1].clone())
} else {
variables.remove(&arguments[0]);
None
};
CommandResult::Continue(Some(arguments[1].clone()))
CommandResult::Continue(output)
}
}
}

View file

@ -1,4 +1,5 @@
use super::*;
use crate::sdk::std::var::set;
use crate::test;
use crate::test::CommandValidation;
@ -14,11 +15,18 @@ fn run_no_arguments() {
#[test]
fn run_only_name() {
test::run_script_and_error(vec![create("")], "out = set_by_name test", "out");
test::run_script_and_validate(
vec![create(""), set::create("")],
r#"
out = set test
set_by_name out
"#,
CommandValidation::None,
);
}
#[test]
fn run_valid() {
fn run_name_and_value() {
let context = test::run_script_and_validate(
vec![create("")],
"out = set_by_name test value",

View file

@ -0,0 +1,24 @@
```sh
unset [names]*
```
Undefines all the variable names provided.
#### Parameters
A list of variable names to undefine.
#### Return Value
None
#### Examples
```sh
var = set 1
defined = is_defined var
assert ${defined}
unset var
defined = is_defined var
assert_false ${defined}
```

View file

@ -0,0 +1,22 @@
use crate::types::command::create_alias_command;
use crate::utils::pckg;
use duckscript::types::command::Command;
use duckscript::types::error::ScriptError;
#[cfg(test)]
#[path = "./mod_test.rs"]
mod mod_test;
pub(crate) fn create(package: &str) -> Result<Box<dyn Command>, ScriptError> {
let name = pckg::concat(package, "Unset");
let command = create_alias_command(
name,
vec!["unset".to_string()],
include_str!("help.md").to_string(),
"unset".to_string(),
include_str!("script.ds").to_string(),
0,
)?;
Ok(Box::new(command))
}

View file

@ -0,0 +1,7 @@
use super::*;
use crate::test;
#[test]
fn common_functions() {
test::test_common_command_functions(create("").unwrap());
}

View file

@ -0,0 +1,4 @@
for scope::unset::name in ${scope::unset::arguments}
set_by_name ${scope::unset::name}
end

View file

@ -201,7 +201,7 @@ impl Command for AliasCommand {
clear(&self.scope_name, variables);
let end_count = variables.len();
if start_count != end_count {
if start_count < end_count {
CommandResult::Crash(
format!(
"Memory leak detected, delta variables count: {}",

View file

@ -1,5 +1,16 @@
fn test_valid
fn test_name_only
name = set test
assert_eq ${name} test
value = set_by_name name
defined = is_defined value
assert_false ${defined}
defined = is_defined name
assert_false ${defined}
end
fn test_name_and_value
name = set test
assert_eq ${name} test

View file

@ -0,0 +1,42 @@
fn test_empty
unset
end
fn test_single
name = set test
assert_eq ${name} test
value = unset name
defined = is_defined value
assert_false ${defined}
defined = is_defined name
assert_false ${defined}
end
fn test_multiple
name1 = set test1
name2 = set test2
value = unset name1 name2
defined = is_defined value
assert_false ${defined}
defined = is_defined name1
assert_false ${defined}
defined = is_defined name2
assert_false ${defined}
end
fn test_not_found_mixed
name1 = set test1
name2 = set test2
value = unset name1 name2 name3 name4 name1
defined = is_defined value
assert_false ${defined}
defined = is_defined name1
assert_false ${defined}
defined = is_defined name2
assert_false ${defined}
end