mirror of
https://github.com/sagiegurari/duckscript
synced 2024-10-14 11:53:05 +00:00
New set_new and is_set commands
This commit is contained in:
parent
1ef91e3fa7
commit
67ab71d93d
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
### v0.3.4
|
### v0.3.4
|
||||||
|
|
||||||
|
* New set_new command.
|
||||||
|
* New is_set command.
|
||||||
* New unset command.
|
* New unset command.
|
||||||
* New array_contains command.
|
* New array_contains command.
|
||||||
* New map_contains_value command.
|
* New map_contains_value command.
|
||||||
|
|
65
docs/sdk.md
65
docs/sdk.md
|
@ -18,6 +18,7 @@
|
||||||
* [std::collections::ArraySet (array_set)](#std__collections__ArraySet)
|
* [std::collections::ArraySet (array_set)](#std__collections__ArraySet)
|
||||||
* [std::collections::IsArray (is_array)](#std__collections__IsArray)
|
* [std::collections::IsArray (is_array)](#std__collections__IsArray)
|
||||||
* [std::collections::IsMap (is_map)](#std__collections__IsMap)
|
* [std::collections::IsMap (is_map)](#std__collections__IsMap)
|
||||||
|
* [std::collections::IsSet (is_set)](#std__collections__IsSet)
|
||||||
* [std::collections::Map (map)](#std__collections__Map)
|
* [std::collections::Map (map)](#std__collections__Map)
|
||||||
* [std::collections::MapClear (map_clear)](#std__collections__MapClear)
|
* [std::collections::MapClear (map_clear)](#std__collections__MapClear)
|
||||||
* [std::collections::MapContainsKey (map_contains_key)](#std__collections__MapContainsKey)
|
* [std::collections::MapContainsKey (map_contains_key)](#std__collections__MapContainsKey)
|
||||||
|
@ -32,6 +33,7 @@
|
||||||
* [std::collections::MapToProperties (map_to_properties)](#std__collections__MapToProperties)
|
* [std::collections::MapToProperties (map_to_properties)](#std__collections__MapToProperties)
|
||||||
* [std::collections::Range (range)](#std__collections__Range)
|
* [std::collections::Range (range)](#std__collections__Range)
|
||||||
* [std::collections::ReadProperties (read_properties)](#std__collections__ReadProperties)
|
* [std::collections::ReadProperties (read_properties)](#std__collections__ReadProperties)
|
||||||
|
* [std::collections::Set (set_new)](#std__collections__Set)
|
||||||
* [std::collections::WriteProperties (write_properties)](#std__collections__WriteProperties)
|
* [std::collections::WriteProperties (write_properties)](#std__collections__WriteProperties)
|
||||||
* [std::debug::DuckscriptSDKVersion (duckscript_sdk_version)](#std__debug__DuckscriptSDKVersion)
|
* [std::debug::DuckscriptSDKVersion (duckscript_sdk_version)](#std__debug__DuckscriptSDKVersion)
|
||||||
* [std::debug::DuckscriptVersion (duckscript_version)](#std__debug__DuckscriptVersion)
|
* [std::debug::DuckscriptVersion (duckscript_version)](#std__debug__DuckscriptVersion)
|
||||||
|
@ -876,6 +878,38 @@ assert ${released}
|
||||||
#### Aliases:
|
#### Aliases:
|
||||||
is_map
|
is_map
|
||||||
|
|
||||||
|
<a name="std__collections__IsSet"></a>
|
||||||
|
## std::collections::IsSet
|
||||||
|
```sh
|
||||||
|
var = is_set handle
|
||||||
|
```
|
||||||
|
|
||||||
|
Returns true if the provided value is a set handle.
|
||||||
|
|
||||||
|
#### Parameters
|
||||||
|
|
||||||
|
The set handle.
|
||||||
|
|
||||||
|
#### Return Value
|
||||||
|
|
||||||
|
True if the provided value is a set handle.
|
||||||
|
|
||||||
|
#### Examples
|
||||||
|
|
||||||
|
```sh
|
||||||
|
handle = set_new 1 2 3
|
||||||
|
|
||||||
|
value = is_set ${handle}
|
||||||
|
assert ${value}
|
||||||
|
|
||||||
|
released = release ${handle}
|
||||||
|
assert ${released}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
#### Aliases:
|
||||||
|
is_set
|
||||||
|
|
||||||
<a name="std__collections__Map"></a>
|
<a name="std__collections__Map"></a>
|
||||||
## std::collections::Map
|
## std::collections::Map
|
||||||
```sh
|
```sh
|
||||||
|
@ -1404,6 +1438,37 @@ assert_eq ${config.a.b.c} 3
|
||||||
#### Aliases:
|
#### Aliases:
|
||||||
read_properties
|
read_properties
|
||||||
|
|
||||||
|
<a name="std__collections__Set"></a>
|
||||||
|
## std::collections::Set
|
||||||
|
```sh
|
||||||
|
handle = set_new value1 value2 value3 ...
|
||||||
|
```
|
||||||
|
|
||||||
|
Creates a new set from the input arguments and returns a handle to that set.<br>
|
||||||
|
This handle can be passed to other commands which support sets using handles.<br>
|
||||||
|
Once the set is no longer used, it should be released using the **release** command.
|
||||||
|
|
||||||
|
#### Parameters
|
||||||
|
|
||||||
|
Any number of arguments which will construct the set.
|
||||||
|
|
||||||
|
#### Return Value
|
||||||
|
|
||||||
|
A handle to the set.
|
||||||
|
|
||||||
|
#### Examples
|
||||||
|
|
||||||
|
```sh
|
||||||
|
handle = set_new ${var} "hello world" 5 ${another_var}
|
||||||
|
|
||||||
|
# once done we should release the handle
|
||||||
|
release ${handle}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
#### Aliases:
|
||||||
|
set_new
|
||||||
|
|
||||||
<a name="std__collections__WriteProperties"></a>
|
<a name="std__collections__WriteProperties"></a>
|
||||||
## std::collections::WriteProperties
|
## std::collections::WriteProperties
|
||||||
```sh
|
```sh
|
||||||
|
|
|
@ -38,7 +38,7 @@ pub enum StateValue {
|
||||||
/// list
|
/// list
|
||||||
List(Vec<StateValue>),
|
List(Vec<StateValue>),
|
||||||
/// unique set of values
|
/// unique set of values
|
||||||
Set(HashSet<StateValue>),
|
Set(HashSet<String>),
|
||||||
/// sub state value
|
/// sub state value
|
||||||
SubState(HashMap<String, StateValue>),
|
SubState(HashMap<String, StateValue>),
|
||||||
/// any value
|
/// any value
|
||||||
|
|
25
duckscript_sdk/src/sdk/std/collections/is_set/help.md
Normal file
25
duckscript_sdk/src/sdk/std/collections/is_set/help.md
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
```sh
|
||||||
|
var = is_set handle
|
||||||
|
```
|
||||||
|
|
||||||
|
Returns true if the provided value is a set handle.
|
||||||
|
|
||||||
|
#### Parameters
|
||||||
|
|
||||||
|
The set handle.
|
||||||
|
|
||||||
|
#### Return Value
|
||||||
|
|
||||||
|
True if the provided value is a set handle.
|
||||||
|
|
||||||
|
#### Examples
|
||||||
|
|
||||||
|
```sh
|
||||||
|
handle = set_new 1 2 3
|
||||||
|
|
||||||
|
value = is_set ${handle}
|
||||||
|
assert ${value}
|
||||||
|
|
||||||
|
released = release ${handle}
|
||||||
|
assert ${released}
|
||||||
|
```
|
70
duckscript_sdk/src/sdk/std/collections/is_set/mod.rs
Executable file
70
duckscript_sdk/src/sdk/std/collections/is_set/mod.rs
Executable file
|
@ -0,0 +1,70 @@
|
||||||
|
use crate::utils::pckg;
|
||||||
|
use crate::utils::state::get_handles_sub_state;
|
||||||
|
use duckscript::types::command::{Command, CommandResult, Commands};
|
||||||
|
use duckscript::types::instruction::Instruction;
|
||||||
|
use duckscript::types::runtime::StateValue;
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
#[path = "./mod_test.rs"]
|
||||||
|
mod mod_test;
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub(crate) struct CommandImpl {
|
||||||
|
package: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Command for CommandImpl {
|
||||||
|
fn name(&self) -> String {
|
||||||
|
pckg::concat(&self.package, "IsSet")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn aliases(&self) -> Vec<String> {
|
||||||
|
vec!["is_set".to_string()]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn help(&self) -> String {
|
||||||
|
include_str!("help.md").to_string()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn clone_and_box(&self) -> Box<dyn Command> {
|
||||||
|
Box::new((*self).clone())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn requires_context(&self) -> bool {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_with_context(
|
||||||
|
&self,
|
||||||
|
arguments: Vec<String>,
|
||||||
|
state: &mut HashMap<String, StateValue>,
|
||||||
|
_variables: &mut HashMap<String, String>,
|
||||||
|
_output_variable: Option<String>,
|
||||||
|
_instructions: &Vec<Instruction>,
|
||||||
|
_commands: &mut Commands,
|
||||||
|
_line: usize,
|
||||||
|
) -> CommandResult {
|
||||||
|
if arguments.is_empty() {
|
||||||
|
CommandResult::Error("Set handle not provided.".to_string())
|
||||||
|
} else {
|
||||||
|
let state = get_handles_sub_state(state);
|
||||||
|
|
||||||
|
let key = &arguments[0];
|
||||||
|
|
||||||
|
match state.get(key) {
|
||||||
|
Some(state_value) => match state_value {
|
||||||
|
StateValue::Set(_) => CommandResult::Continue(Some("true".to_string())),
|
||||||
|
_ => CommandResult::Continue(Some("false".to_string())),
|
||||||
|
},
|
||||||
|
None => CommandResult::Continue(Some("false".to_string())),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn create(package: &str) -> Box<dyn Command> {
|
||||||
|
Box::new(CommandImpl {
|
||||||
|
package: package.to_string(),
|
||||||
|
})
|
||||||
|
}
|
47
duckscript_sdk/src/sdk/std/collections/is_set/mod_test.rs
Normal file
47
duckscript_sdk/src/sdk/std/collections/is_set/mod_test.rs
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
use super::*;
|
||||||
|
use crate::sdk::std::collections::set;
|
||||||
|
use crate::test;
|
||||||
|
use crate::test::{CommandValidation, SetCommand};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn common_functions() {
|
||||||
|
test::test_common_command_functions(create(""));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn run_no_args() {
|
||||||
|
test::run_script_and_error(vec![create("")], "out = is_set", "out");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn run_not_found() {
|
||||||
|
test::run_script_and_validate(
|
||||||
|
vec![create("")],
|
||||||
|
"out = is_set bad_handle",
|
||||||
|
CommandValidation::Match("out".to_string(), "false".to_string()),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn run_not_set() {
|
||||||
|
test::run_script_and_validate(
|
||||||
|
vec![create(""), Box::new(SetCommand {})],
|
||||||
|
r#"
|
||||||
|
handle = test_set true
|
||||||
|
out = is_set ${handle}
|
||||||
|
"#,
|
||||||
|
CommandValidation::Match("out".to_string(), "false".to_string()),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn run_found() {
|
||||||
|
test::run_script_and_validate(
|
||||||
|
vec![create(""), set::create("")],
|
||||||
|
r#"
|
||||||
|
handle = set_new a b c "d e"
|
||||||
|
out = is_set ${handle}
|
||||||
|
"#,
|
||||||
|
CommandValidation::Match("out".to_string(), "true".to_string()),
|
||||||
|
);
|
||||||
|
}
|
|
@ -10,6 +10,7 @@ mod array_push;
|
||||||
mod array_set;
|
mod array_set;
|
||||||
mod is_array;
|
mod is_array;
|
||||||
mod is_map;
|
mod is_map;
|
||||||
|
mod is_set;
|
||||||
mod map;
|
mod map;
|
||||||
mod map_clear;
|
mod map_clear;
|
||||||
mod map_contains_key;
|
mod map_contains_key;
|
||||||
|
@ -24,6 +25,7 @@ mod map_size;
|
||||||
mod map_to_properties;
|
mod map_to_properties;
|
||||||
mod range;
|
mod range;
|
||||||
mod read_properties;
|
mod read_properties;
|
||||||
|
mod set;
|
||||||
mod write_properties;
|
mod write_properties;
|
||||||
|
|
||||||
use crate::utils::pckg;
|
use crate::utils::pckg;
|
||||||
|
@ -47,6 +49,7 @@ pub(crate) fn load(commands: &mut Commands, parent: &str) -> Result<(), ScriptEr
|
||||||
commands.set(array_pop::create(&package))?;
|
commands.set(array_pop::create(&package))?;
|
||||||
commands.set(is_array::create(&package))?;
|
commands.set(is_array::create(&package))?;
|
||||||
commands.set(is_map::create(&package))?;
|
commands.set(is_map::create(&package))?;
|
||||||
|
commands.set(is_set::create(&package))?;
|
||||||
commands.set(map::create(&package))?;
|
commands.set(map::create(&package))?;
|
||||||
commands.set(map_clear::create(&package))?;
|
commands.set(map_clear::create(&package))?;
|
||||||
commands.set(map_contains_key::create(&package)?)?;
|
commands.set(map_contains_key::create(&package)?)?;
|
||||||
|
@ -61,6 +64,7 @@ pub(crate) fn load(commands: &mut Commands, parent: &str) -> Result<(), ScriptEr
|
||||||
commands.set(map_to_properties::create(&package))?;
|
commands.set(map_to_properties::create(&package))?;
|
||||||
commands.set(range::create(&package))?;
|
commands.set(range::create(&package))?;
|
||||||
commands.set(read_properties::create(&package))?;
|
commands.set(read_properties::create(&package))?;
|
||||||
|
commands.set(set::create(&package))?;
|
||||||
commands.set(write_properties::create(&package))?;
|
commands.set(write_properties::create(&package))?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
24
duckscript_sdk/src/sdk/std/collections/set/help.md
Normal file
24
duckscript_sdk/src/sdk/std/collections/set/help.md
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
```sh
|
||||||
|
handle = set_new value1 value2 value3 ...
|
||||||
|
```
|
||||||
|
|
||||||
|
Creates a new set from the input arguments and returns a handle to that set.<br>
|
||||||
|
This handle can be passed to other commands which support sets using handles.<br>
|
||||||
|
Once the set is no longer used, it should be released using the **release** command.
|
||||||
|
|
||||||
|
#### Parameters
|
||||||
|
|
||||||
|
Any number of arguments which will construct the set.
|
||||||
|
|
||||||
|
#### Return Value
|
||||||
|
|
||||||
|
A handle to the set.
|
||||||
|
|
||||||
|
#### Examples
|
||||||
|
|
||||||
|
```sh
|
||||||
|
handle = set_new ${var} "hello world" 5 ${another_var}
|
||||||
|
|
||||||
|
# once done we should release the handle
|
||||||
|
release ${handle}
|
||||||
|
```
|
64
duckscript_sdk/src/sdk/std/collections/set/mod.rs
Executable file
64
duckscript_sdk/src/sdk/std/collections/set/mod.rs
Executable file
|
@ -0,0 +1,64 @@
|
||||||
|
use crate::utils::pckg;
|
||||||
|
use crate::utils::state::put_handle;
|
||||||
|
use duckscript::types::command::{Command, CommandResult, Commands};
|
||||||
|
use duckscript::types::instruction::Instruction;
|
||||||
|
use duckscript::types::runtime::StateValue;
|
||||||
|
use std::collections::{HashMap, HashSet};
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
#[path = "./mod_test.rs"]
|
||||||
|
mod mod_test;
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub(crate) struct CommandImpl {
|
||||||
|
package: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Command for CommandImpl {
|
||||||
|
fn name(&self) -> String {
|
||||||
|
pckg::concat(&self.package, "Set")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn aliases(&self) -> Vec<String> {
|
||||||
|
vec!["set_new".to_string()]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn help(&self) -> String {
|
||||||
|
include_str!("help.md").to_string()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn clone_and_box(&self) -> Box<dyn Command> {
|
||||||
|
Box::new((*self).clone())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn requires_context(&self) -> bool {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_with_context(
|
||||||
|
&self,
|
||||||
|
arguments: Vec<String>,
|
||||||
|
state: &mut HashMap<String, StateValue>,
|
||||||
|
_variables: &mut HashMap<String, String>,
|
||||||
|
_output_variable: Option<String>,
|
||||||
|
_instructions: &Vec<Instruction>,
|
||||||
|
_commands: &mut Commands,
|
||||||
|
_line: usize,
|
||||||
|
) -> CommandResult {
|
||||||
|
let mut set = HashSet::new();
|
||||||
|
|
||||||
|
for argument in arguments {
|
||||||
|
set.insert(argument);
|
||||||
|
}
|
||||||
|
|
||||||
|
let key = put_handle(state, StateValue::Set(set));
|
||||||
|
|
||||||
|
CommandResult::Continue(Some(key))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn create(package: &str) -> Box<dyn Command> {
|
||||||
|
Box::new(CommandImpl {
|
||||||
|
package: package.to_string(),
|
||||||
|
})
|
||||||
|
}
|
41
duckscript_sdk/src/sdk/std/collections/set/mod_test.rs
Normal file
41
duckscript_sdk/src/sdk/std/collections/set/mod_test.rs
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
use super::*;
|
||||||
|
use crate::test;
|
||||||
|
use crate::test::CommandValidation;
|
||||||
|
use crate::utils::state::get_handles_sub_state;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn common_functions() {
|
||||||
|
test::test_common_command_functions(create(""));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn run_no_args() {
|
||||||
|
let mut context = test::run_script_and_validate(
|
||||||
|
vec![create("")],
|
||||||
|
"out = set_new",
|
||||||
|
CommandValidation::Contains("out".to_string(), "handle:".to_string()),
|
||||||
|
);
|
||||||
|
|
||||||
|
let state = get_handles_sub_state(&mut context.state);
|
||||||
|
let list_value = state.get(context.variables.get("out").unwrap()).unwrap();
|
||||||
|
match list_value {
|
||||||
|
StateValue::Set(set) => assert!(set.is_empty()),
|
||||||
|
_ => panic!("Invalid handle type."),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn run_with_args() {
|
||||||
|
let mut context = test::run_script_and_validate(
|
||||||
|
vec![create("")],
|
||||||
|
r#"out = set_new 1 "hello world" test"#,
|
||||||
|
CommandValidation::Contains("out".to_string(), "handle:".to_string()),
|
||||||
|
);
|
||||||
|
|
||||||
|
let state = get_handles_sub_state(&mut context.state);
|
||||||
|
let list_value = state.remove(context.variables.get("out").unwrap()).unwrap();
|
||||||
|
match list_value {
|
||||||
|
StateValue::Set(set) => assert_eq!(set.len(), 3),
|
||||||
|
_ => panic!("Invalid handle type."),
|
||||||
|
}
|
||||||
|
}
|
22
test/std/collections/is_set_test.ds
Normal file
22
test/std/collections/is_set_test.ds
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
|
||||||
|
fn test_set_found
|
||||||
|
set_handle = set_new
|
||||||
|
|
||||||
|
value = is_set ${set_handle}
|
||||||
|
assert ${value}
|
||||||
|
|
||||||
|
released = release ${set_handle}
|
||||||
|
assert ${released}
|
||||||
|
end
|
||||||
|
|
||||||
|
fn test_not_set
|
||||||
|
set_handle = set true
|
||||||
|
|
||||||
|
value = is_set ${set_handle}
|
||||||
|
assert_false ${value}
|
||||||
|
end
|
||||||
|
|
||||||
|
fn test_not_found
|
||||||
|
value = is_set ${set_handle}
|
||||||
|
assert_false ${value}
|
||||||
|
end
|
Loading…
Reference in a new issue