Skip to content

Commit ebd6321

Browse files
committed
ref: import changes
1 parent d6a5353 commit ebd6321

File tree

15 files changed

+153
-237
lines changed

15 files changed

+153
-237
lines changed

Cargo.lock

Lines changed: 23 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ edition = "2024"
88

99
[workspace.dependencies]
1010
code0-flow = { version = "0.0.18" }
11-
tucana = { version = "0.0.39" }
11+
tucana = { version = "0.0.40" }
1212
tokio = { version = "1.44.1", features = ["rt-multi-thread"] }
1313
log = "0.4.27"
1414
futures-lite = "2.6.0"

taurus/src/context/argument.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use tucana::shared::{ListValue, Struct, Value};
88
pub enum Argument {
99
// Eval => Evaluated Value
1010
// - can be consumed directly by a function
11-
Eval(tucana::shared::Value),
11+
Eval(Value),
1212
// Thunk of NodeFunction identifier
1313
// - used for lazy execution of nodes
1414
Thunk(i64),

taurus/src/context/context.rs

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,32 @@
1-
pub struct Context {}
1+
use crate::error::RuntimeError;
2+
use std::collections::HashMap;
3+
use tucana::shared::Value;
4+
5+
#[derive(Clone)]
6+
pub enum ContextResult {
7+
Error(RuntimeError),
8+
Success(Value),
9+
NotFound,
10+
}
11+
12+
#[derive(Default)]
13+
pub struct Context {
14+
results: HashMap<i64, ContextResult>,
15+
}
16+
17+
impl Context {
18+
pub fn get(&mut self, id: i64) -> ContextResult {
19+
match self.results.get(&id) {
20+
None => ContextResult::NotFound,
21+
Some(result) => result.clone(),
22+
}
23+
}
24+
25+
pub fn insert_success(&mut self, id: i64, value: Value) {
26+
self.results.insert(id, ContextResult::Success(value));
27+
}
28+
29+
pub fn insert_error(&mut self, id: i64, runtime_error: RuntimeError) {
30+
self.results.insert(id, ContextResult::Error(runtime_error));
31+
}
32+
}

taurus/src/context/executor.rs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
use crate::context::Context;
21
use crate::context::argument::{Argument, ParameterNode};
2+
use crate::context::context::{Context, ContextResult};
33
use crate::context::registry::FunctionStore;
44
use crate::context::signal::Signal;
55
use crate::error::RuntimeError;
@@ -75,8 +75,23 @@ impl<'a> Executor<'a> {
7575
tucana::shared::node_value::Value::LiteralValue(val) => {
7676
args.push(Argument::Eval(val.clone()))
7777
}
78-
tucana::shared::node_value::Value::ReferenceValue(_r) => {
79-
unimplemented!("ReferenceValue")
78+
tucana::shared::node_value::Value::ReferenceValue(reference) => {
79+
let mut ctx = self.context.borrow_mut();
80+
let value = ctx.get(reference.node_id);
81+
match value {
82+
ContextResult::Error(runtime_error) => {
83+
return Signal::Failure(runtime_error);
84+
}
85+
ContextResult::Success(result) => {
86+
args.push(Argument::Eval(result.clone()));
87+
}
88+
ContextResult::NotFound => {
89+
return Signal::Failure(RuntimeError::simple_str(
90+
"ReferenceValueNotFound",
91+
"The given node has not been executed but referenced.",
92+
));
93+
}
94+
}
8095
}
8196
tucana::shared::node_value::Value::NodeFunctionId(id) => {
8297
args.push(Argument::Thunk(*id))

taurus/src/context/mod.rs

Lines changed: 1 addition & 151 deletions
Original file line numberDiff line numberDiff line change
@@ -3,154 +3,4 @@ pub mod context;
33
pub mod executor;
44
pub mod macros;
55
pub mod registry;
6-
pub mod signal;
7-
8-
use crate::error::RuntimeError;
9-
use std::{
10-
collections::{HashMap, VecDeque},
11-
ops::Index,
12-
};
13-
use tucana::shared::{ReferenceValue, Value};
14-
15-
type NodeResult = Result<Value, RuntimeError>;
16-
17-
pub enum ContextResult {
18-
// Will return the value / error if present of an executed node
19-
NodeExecutionResult(NodeResult),
20-
21-
// Will return the parameter of the node (indexed by the context)
22-
ParameterResult(Value),
23-
}
24-
25-
#[derive(Clone)]
26-
pub struct ContextEntry {
27-
result: Result<Value, RuntimeError>,
28-
parameter: Vec<Value>,
29-
}
30-
31-
impl ContextEntry {
32-
pub fn new(result: NodeResult, parameter: Vec<Value>) -> Self {
33-
ContextEntry { result, parameter }
34-
}
35-
}
36-
37-
#[derive(Debug, PartialEq, Eq, Hash, Clone)]
38-
pub struct ContextReference {
39-
// Level referencing the context depth (if a node will execute nodes in itself, e.g. foreach, map...)
40-
pub primary_level: i32,
41-
42-
// Level of depth in the current context level (node after node starting_node -> next_node --> next_node --> ending_node)
43-
pub secondary_level: i32,
44-
45-
// Index of parameters as input parameter of a node
46-
pub tertiary_level: Option<i32>,
47-
}
48-
49-
pub struct Context {
50-
current_context_level: ContextReference,
51-
/// A stack of environments: layer 0 is the outermost.
52-
layers: HashMap<ContextReference, ContextEntry>,
53-
/// Context Snapshot of Past Context
54-
context_history: VecDeque<(i32, i32)>,
55-
}
56-
57-
impl Default for Context {
58-
fn default() -> Self {
59-
Self::new()
60-
}
61-
}
62-
63-
impl Context {
64-
/// Create a new, empty context.
65-
pub fn new() -> Self {
66-
Context {
67-
current_context_level: ContextReference {
68-
primary_level: 0,
69-
secondary_level: 0,
70-
tertiary_level: None,
71-
},
72-
layers: HashMap::new(),
73-
context_history: VecDeque::new(),
74-
}
75-
}
76-
77-
pub fn write_to_context(&mut self, reference: ContextReference, entry: ContextEntry) {
78-
self.layers.insert(reference, entry);
79-
}
80-
81-
pub fn write_to_current_context(&mut self, entry: ContextEntry) {
82-
self.write_to_context(self.current_context_level.clone(), entry);
83-
}
84-
85-
pub fn set_current_context(
86-
&mut self,
87-
primary_level: i32,
88-
seconday_level: i32,
89-
tertiary_level: Option<i32>,
90-
) {
91-
self.current_context_level.primary_level = primary_level;
92-
self.current_context_level.secondary_level = seconday_level;
93-
self.current_context_level.tertiary_level = tertiary_level;
94-
}
95-
96-
/// Will indent the context and save the past context
97-
pub fn next_context(&mut self) {
98-
let context_snapshot = (
99-
self.current_context_level.primary_level,
100-
self.current_context_level.secondary_level,
101-
);
102-
103-
self.context_history.push_back(context_snapshot);
104-
105-
self.current_context_level.primary_level += 1;
106-
self.current_context_level.secondary_level = 0;
107-
}
108-
109-
/// Will return to the parent context and increment the seconday level
110-
pub fn leave_context(&mut self) {
111-
let last_snapshot = match self.context_history.pop_back() {
112-
Some(pair) => pair,
113-
None => return,
114-
};
115-
116-
self.current_context_level.primary_level = last_snapshot.0;
117-
self.current_context_level.secondary_level = last_snapshot.1 + 1;
118-
}
119-
120-
pub fn next_node(&mut self) {
121-
self.current_context_level.secondary_level += 1;
122-
}
123-
124-
// Looks up the current Context
125-
pub fn get_current_context(&self) -> Option<ContextResult> {
126-
for (context, value) in self.layers.iter() {
127-
if context.primary_level != self.current_context_level.primary_level {
128-
continue;
129-
}
130-
131-
if context.secondary_level != self.current_context_level.secondary_level {
132-
continue;
133-
}
134-
135-
if let Some(index) = self.current_context_level.tertiary_level {
136-
let params = &value.parameter;
137-
138-
let real_index = index as usize;
139-
let value = params.index(real_index);
140-
return Some(ContextResult::ParameterResult(value.clone()));
141-
}
142-
143-
return Some(ContextResult::NodeExecutionResult(value.result.clone()));
144-
}
145-
None
146-
}
147-
148-
/// Looks up the context of a reference
149-
pub fn get(&self, reference: &ReferenceValue) -> Option<ContextResult> {
150-
unimplemented!("Implement latest reference pattern from Tucana 0.0.39")
151-
}
152-
153-
pub fn is_end(&self) -> bool {
154-
self.current_context_level.primary_level == 0
155-
}
156-
}
6+
pub mod signal;

taurus/src/context/registry.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::context::Context;
1+
use crate::context::context::Context;
22
use crate::context::argument::{Argument, ParameterNode};
33
use crate::context::signal::Signal;
44
use std::collections::HashMap;

0 commit comments

Comments
 (0)