@@ -25,9 +25,10 @@ use serde_json::{from_str, to_string, Value};
2525use serde_norway:: { from_reader, from_str as from_yaml_str} ;
2626
2727use crate :: pdl:: ast:: {
28- ArrayBlock , CallBlock , Closure , DataBlock , FunctionBlock , IfBlock , IncludeBlock , ListOrString ,
29- MessageBlock , ModelBlock , ObjectBlock , PdlBlock , PdlParser , PdlResult , PdlUsage ,
30- PythonCodeBlock , ReadBlock , RepeatBlock , Role , Scope , SequencingBlock , StringOrBoolean ,
28+ ArrayBlock , CallBlock , Closure , DataBlock , EmptyBlock , FunctionBlock , IfBlock , ImportBlock ,
29+ IncludeBlock , ListOrString , MessageBlock , ModelBlock , ObjectBlock , PdlBlock , PdlParser ,
30+ PdlResult , PdlUsage , PythonCodeBlock , ReadBlock , RepeatBlock , Role , Scope , SequencingBlock ,
31+ StringOrBoolean ,
3132} ;
3233
3334type Context = Vec < ChatMessage > ;
@@ -99,7 +100,9 @@ impl<'a> Interpreter<'a> {
99100 ) ) ,
100101 PdlBlock :: String ( s) => self . run_string ( s, context) . await ,
101102 PdlBlock :: Call ( block) => self . run_call ( block, context) . await ,
103+ PdlBlock :: Empty ( block) => self . run_empty ( block, context) . await ,
102104 PdlBlock :: If ( block) => self . run_if ( block, context) . await ,
105+ PdlBlock :: Import ( block) => self . run_import ( block, context) . await ,
103106 PdlBlock :: Include ( block) => self . run_include ( block, context) . await ,
104107 PdlBlock :: Model ( block) => self . run_model ( block, context) . await ,
105108 PdlBlock :: Data ( block) => self . run_data ( block, context) . await ,
@@ -230,7 +233,11 @@ impl<'a> Interpreter<'a> {
230233 fn path_to ( & self , file_path : & String ) -> PathBuf {
231234 let mut path = self . cwd . clone ( ) ;
232235 path. push ( file_path) ;
233- path
236+ if path. extension ( ) . is_none ( ) {
237+ path. with_extension ( "pdl" )
238+ } else {
239+ path
240+ }
234241 }
235242
236243 fn def (
@@ -299,6 +306,7 @@ impl<'a> Interpreter<'a> {
299306 async fn run_call ( & mut self , block : & CallBlock , context : Context ) -> Interpretation {
300307 if self . debug {
301308 eprintln ! ( "Call {:?}({:?})" , block. call, block. args) ;
309+ eprintln ! ( "Call scope {:?}" , self . scope. last( ) ) ;
302310 }
303311
304312 let res = match self . eval ( & block. call ) ? {
@@ -328,6 +336,21 @@ impl<'a> Interpreter<'a> {
328336 res
329337 }
330338
339+ /// Run a PdlBlock::Empty
340+ async fn run_empty ( & mut self , block : & EmptyBlock , _context : Context ) -> Interpretation {
341+ if self . debug {
342+ eprintln ! ( "Empty" ) ;
343+ }
344+
345+ let trace = block. clone ( ) ;
346+ self . process_defs ( & Some ( block. defs . clone ( ) ) ) . await ?;
347+ Ok ( (
348+ PdlResult :: Dict ( self . scope . last ( ) . unwrap_or ( & HashMap :: new ( ) ) . clone ( ) ) ,
349+ vec ! [ ] ,
350+ PdlBlock :: Empty ( trace) ,
351+ ) )
352+ }
353+
331354 /// Run a PdlBlock::Call
332355 async fn run_if ( & mut self , block : & IfBlock , context : Context ) -> Interpretation {
333356 if self . debug {
@@ -362,8 +385,30 @@ impl<'a> Interpreter<'a> {
362385 eprintln ! ( "Include {:?}" , block. include) ;
363386 }
364387
365- self . run_quiet ( & parse_file ( & self . path_to ( & block. include ) ) ?, context. clone ( ) )
366- . await
388+ let path = self . path_to ( & block. include ) ;
389+ let old_cwd = self . cwd . clone ( ) ;
390+ if let Some ( cwd) = path. parent ( ) {
391+ self . cwd = cwd. to_path_buf ( )
392+ }
393+ let res = self . run_quiet ( & parse_file ( & path) ?, context. clone ( ) ) . await ;
394+ self . cwd = old_cwd;
395+ res
396+ }
397+
398+ /// Run a PdlBlock::Import
399+ async fn run_import ( & mut self , block : & ImportBlock , context : Context ) -> Interpretation {
400+ if self . debug {
401+ eprintln ! ( "Import {:?}" , block. import) ;
402+ }
403+
404+ let path = self . path_to ( & block. import ) ;
405+ let old_cwd = self . cwd . clone ( ) ;
406+ if let Some ( cwd) = path. parent ( ) {
407+ self . cwd = cwd. to_path_buf ( )
408+ }
409+ let res = self . run_quiet ( & parse_file ( & path) ?, context. clone ( ) ) . await ;
410+ self . cwd = old_cwd;
411+ res
367412 }
368413
369414 fn to_ollama_model_options (
0 commit comments