Implement get
This commit is contained in:
parent
c698c847c7
commit
e97daafdca
@ -1,6 +1,6 @@
|
||||
//! Macros for collection values: strings, lists, maps and tables.
|
||||
|
||||
use crate::{Error, Macro, MacroInfo, Result, Table, Value, VariableMap};
|
||||
use crate::{Error, Macro, MacroInfo, Result, Table, Value, ValueType, VariableMap};
|
||||
|
||||
pub struct Transform;
|
||||
|
||||
@ -10,7 +10,10 @@ impl Macro for Transform {
|
||||
identifier: "transform",
|
||||
description: "Change each value with a function.",
|
||||
group: "collections",
|
||||
inputs: vec![],
|
||||
inputs: vec![ValueType::ListOf(vec![
|
||||
ValueType::List,
|
||||
ValueType::Function,
|
||||
])],
|
||||
}
|
||||
}
|
||||
|
||||
@ -177,7 +180,10 @@ impl Macro for Get {
|
||||
identifier: "get",
|
||||
description: "Retrieve a value from a collection.",
|
||||
group: "collections",
|
||||
inputs: vec![],
|
||||
inputs: vec![
|
||||
ValueType::ListOf(vec![ValueType::List, ValueType::Integer]),
|
||||
ValueType::ListOf(vec![ValueType::Map, ValueType::String]),
|
||||
],
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -36,7 +36,7 @@ impl Macro for AssertEqual {
|
||||
identifier: "assert_equal",
|
||||
description: "Panic if two values do not match.",
|
||||
group: "test",
|
||||
inputs: vec![ValueType::List(vec![ValueType::Any, ValueType::Any])],
|
||||
inputs: vec![ValueType::ListOf(vec![ValueType::Any, ValueType::Any])],
|
||||
}
|
||||
}
|
||||
|
||||
@ -61,11 +61,11 @@ impl Macro for If {
|
||||
description: "Evaluates the first argument. If true, it does the second argument.",
|
||||
group: "logic",
|
||||
inputs: vec![
|
||||
ValueType::List(vec![
|
||||
ValueType::ListOf(vec![
|
||||
ValueType::Boolean,
|
||||
ValueType::Any,
|
||||
]),
|
||||
ValueType::List(vec![
|
||||
ValueType::ListOf(vec![
|
||||
ValueType::Function,
|
||||
ValueType::Any,
|
||||
])],
|
||||
@ -99,12 +99,12 @@ impl Macro for IfElse {
|
||||
description: "Evaluates the first argument. If true, it does the second argument. If false, it does the third argument",
|
||||
group: "logic",
|
||||
inputs: vec![
|
||||
ValueType::List(vec![
|
||||
ValueType::ListOf(vec![
|
||||
ValueType::Boolean,
|
||||
ValueType::Any,
|
||||
ValueType::Any,
|
||||
]),
|
||||
ValueType::List(vec![
|
||||
ValueType::ListOf(vec![
|
||||
ValueType::Function,
|
||||
ValueType::Any,
|
||||
ValueType::Any,
|
||||
@ -157,15 +157,3 @@ impl Macro for Loop {
|
||||
Loop.run(argument)
|
||||
}
|
||||
}
|
||||
|
||||
pub struct While;
|
||||
|
||||
impl Macro for While {
|
||||
fn info(&self) -> MacroInfo<'static> {
|
||||
todo!()
|
||||
}
|
||||
|
||||
fn run(&self, _argument: &Value) -> Result<Value> {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
@ -8,9 +8,10 @@ pub enum ValueType {
|
||||
Any,
|
||||
String,
|
||||
Float,
|
||||
Int,
|
||||
Integer,
|
||||
Boolean,
|
||||
List(Vec<ValueType>),
|
||||
List,
|
||||
ListOf(Vec<ValueType>),
|
||||
Empty,
|
||||
Map,
|
||||
Table,
|
||||
@ -27,9 +28,12 @@ impl PartialEq for ValueType {
|
||||
(_, ValueType::Any) => true,
|
||||
(ValueType::String, ValueType::String) => true,
|
||||
(ValueType::Float, ValueType::Float) => true,
|
||||
(ValueType::Int, ValueType::Int) => true,
|
||||
(ValueType::Integer, ValueType::Integer) => true,
|
||||
(ValueType::Boolean, ValueType::Boolean) => true,
|
||||
(ValueType::List(left), ValueType::List(right)) => left == right,
|
||||
(ValueType::ListOf(left), ValueType::ListOf(right)) => left == right,
|
||||
(ValueType::ListOf(_), ValueType::List) => true,
|
||||
(ValueType::List, ValueType::ListOf(_)) => true,
|
||||
(ValueType::List, ValueType::List) => true,
|
||||
(ValueType::Empty, ValueType::Empty) => true,
|
||||
(ValueType::Map, ValueType::Map) => true,
|
||||
(ValueType::Table, ValueType::Table) => true,
|
||||
@ -42,21 +46,27 @@ impl PartialEq for ValueType {
|
||||
|
||||
impl Display for ValueType {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
let text = match &self {
|
||||
ValueType::Any => "any",
|
||||
ValueType::String => "string",
|
||||
ValueType::Float => "float",
|
||||
ValueType::Int => "integer",
|
||||
ValueType::Boolean => "boolean",
|
||||
ValueType::List(_) => "list",
|
||||
ValueType::Empty => "empty",
|
||||
ValueType::Map => "map",
|
||||
ValueType::Table => "table",
|
||||
ValueType::Function => "function",
|
||||
ValueType::Time => "time",
|
||||
};
|
||||
match &self {
|
||||
ValueType::Any => write!(f, "any"),
|
||||
ValueType::String => write!(f, "string"),
|
||||
ValueType::Float => write!(f, "float"),
|
||||
ValueType::Integer => write!(f, "integer"),
|
||||
ValueType::Boolean => write!(f, "boolean"),
|
||||
ValueType::List => write!(f, "list"),
|
||||
ValueType::ListOf(items) => {
|
||||
let items = items
|
||||
.iter()
|
||||
.map(|value_type| value_type.to_string() + " ")
|
||||
.collect::<String>();
|
||||
|
||||
write!(f, "{text}")
|
||||
write!(f, "list of {items}")
|
||||
}
|
||||
ValueType::Empty => write!(f, "empty"),
|
||||
ValueType::Map => write!(f, "map"),
|
||||
ValueType::Table => write!(f, "table"),
|
||||
ValueType::Function => write!(f, "function"),
|
||||
ValueType::Time => write!(f, "time"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -65,10 +75,10 @@ impl From<&Value> for ValueType {
|
||||
match value {
|
||||
Value::String(_) => ValueType::String,
|
||||
Value::Float(_) => ValueType::Float,
|
||||
Value::Integer(_) => ValueType::Int,
|
||||
Value::Integer(_) => ValueType::Integer,
|
||||
Value::Boolean(_) => ValueType::Boolean,
|
||||
Value::List(list) => {
|
||||
ValueType::List(list.iter().map(|value| value.value_type()).collect())
|
||||
ValueType::ListOf(list.iter().map(|value| value.value_type()).collect())
|
||||
}
|
||||
Value::Empty => ValueType::Empty,
|
||||
Value::Map(_) => ValueType::Map,
|
||||
|
7
tests/collections.ds
Normal file
7
tests/collections.ds
Normal file
@ -0,0 +1,7 @@
|
||||
list = (1, 2, 3);
|
||||
|
||||
test = transform(list, 'input + 1');
|
||||
assert_equal((2, 3, 4), test);
|
||||
|
||||
test = get(list, 0);
|
||||
assert_equal(1, test);
|
10
tests/dust_tests.rs
Normal file
10
tests/dust_tests.rs
Normal file
@ -0,0 +1,10 @@
|
||||
use std::fs::read_to_string;
|
||||
|
||||
use whale_lib::*;
|
||||
|
||||
#[test]
|
||||
fn collections() {
|
||||
let file_contents = read_to_string("tests/collections.ds").unwrap();
|
||||
|
||||
eval(&file_contents).unwrap();
|
||||
}
|
Loading…
Reference in New Issue
Block a user