Implement output tool
This commit is contained in:
parent
02b237b11b
commit
b123b90298
@ -1,7 +1,9 @@
|
|||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use tree_sitter::Node;
|
use tree_sitter::Node;
|
||||||
|
|
||||||
use crate::{value_node::ValueNode, AbstractTree, Error, Identifier, Result, Value, VariableMap};
|
use crate::{
|
||||||
|
value_node::ValueNode, AbstractTree, Error, Identifier, Result, Tool, Value, VariableMap,
|
||||||
|
};
|
||||||
|
|
||||||
use super::{function_call::FunctionCall, logic::Logic, math::Math};
|
use super::{function_call::FunctionCall, logic::Logic, math::Math};
|
||||||
|
|
||||||
@ -12,6 +14,7 @@ pub enum Expression {
|
|||||||
Math(Box<Math>),
|
Math(Box<Math>),
|
||||||
Logic(Box<Logic>),
|
Logic(Box<Logic>),
|
||||||
FunctionCall(FunctionCall),
|
FunctionCall(FunctionCall),
|
||||||
|
Tool(Box<Tool>),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AbstractTree for Expression {
|
impl AbstractTree for Expression {
|
||||||
@ -28,6 +31,7 @@ impl AbstractTree for Expression {
|
|||||||
"function_call" => {
|
"function_call" => {
|
||||||
Expression::FunctionCall(FunctionCall::from_syntax_node(source, child)?)
|
Expression::FunctionCall(FunctionCall::from_syntax_node(source, child)?)
|
||||||
}
|
}
|
||||||
|
"tool" => Expression::Tool(Box::new(Tool::from_syntax_node(source, child)?)),
|
||||||
_ => continue,
|
_ => continue,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -51,6 +55,7 @@ impl AbstractTree for Expression {
|
|||||||
Expression::Math(math) => math.run(source, context),
|
Expression::Math(math) => math.run(source, context),
|
||||||
Expression::Logic(logic) => logic.run(source, context),
|
Expression::Logic(logic) => logic.run(source, context),
|
||||||
Expression::FunctionCall(function_call) => function_call.run(source, context),
|
Expression::FunctionCall(function_call) => function_call.run(source, context),
|
||||||
|
Expression::Tool(tool) => tool.run(source, context),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,7 @@ pub mod math;
|
|||||||
pub mod remove;
|
pub mod remove;
|
||||||
pub mod select;
|
pub mod select;
|
||||||
pub mod statement;
|
pub mod statement;
|
||||||
|
pub mod tool;
|
||||||
pub mod transform;
|
pub mod transform;
|
||||||
pub mod value_node;
|
pub mod value_node;
|
||||||
pub mod r#while;
|
pub mod r#while;
|
||||||
@ -29,7 +30,7 @@ pub mod r#while;
|
|||||||
pub use {
|
pub use {
|
||||||
assignment::*, expression::*, filter::*, find::*, function_call::*, identifier::*, if_else::*,
|
assignment::*, expression::*, filter::*, find::*, function_call::*, identifier::*, if_else::*,
|
||||||
item::*, logic::*, math::*, r#async::*, r#for::*, r#match::*, r#while::*, remove::*, select::*,
|
item::*, logic::*, math::*, r#async::*, r#for::*, r#match::*, r#while::*, remove::*, select::*,
|
||||||
statement::*, transform::*,
|
statement::*, tool::*, transform::*, value_node::*,
|
||||||
};
|
};
|
||||||
|
|
||||||
use tree_sitter::Node;
|
use tree_sitter::Node;
|
||||||
|
51
src/abstract_tree/tool.rs
Normal file
51
src/abstract_tree/tool.rs
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use tree_sitter::Node;
|
||||||
|
|
||||||
|
use crate::{AbstractTree, Error, Expression, Result, Value, VariableMap};
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)]
|
||||||
|
pub enum Tool {
|
||||||
|
Output(Vec<Expression>),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AbstractTree for Tool {
|
||||||
|
fn from_syntax_node(source: &str, node: Node) -> Result<Self> {
|
||||||
|
let mut expressions = Vec::new();
|
||||||
|
|
||||||
|
for index in 2..node.child_count() - 1 {
|
||||||
|
let expression_node = node.child(index).unwrap();
|
||||||
|
let expression = Expression::from_syntax_node(source, expression_node)?;
|
||||||
|
|
||||||
|
expressions.push(expression);
|
||||||
|
}
|
||||||
|
|
||||||
|
let tool_node = node.child(1).unwrap();
|
||||||
|
let tool = match tool_node.kind() {
|
||||||
|
"output" => Tool::Output(expressions),
|
||||||
|
_ => {
|
||||||
|
return Err(Error::UnexpectedSyntaxNode {
|
||||||
|
expected: "output",
|
||||||
|
actual: tool_node.kind(),
|
||||||
|
location: tool_node.start_position(),
|
||||||
|
relevant_source: source[tool_node.byte_range()].to_string(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(tool)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run(&self, source: &str, context: &mut VariableMap) -> Result<Value> {
|
||||||
|
match self {
|
||||||
|
Tool::Output(expressions) => {
|
||||||
|
for expression in expressions {
|
||||||
|
let value = expression.run(source, context)?;
|
||||||
|
|
||||||
|
println!("{value}");
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(Value::Empty)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user