@@ -3,154 +3,4 @@ pub mod context;
33pub mod executor;
44pub mod macros;
55pub 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;
0 commit comments