1- use std:: { borrow:: Cow , collections:: BTreeMap } ;
2-
1+ use once_cell:: sync:: Lazy ;
32use schemars:: { JsonSchema , Schema , SchemaGenerator } ;
43use serde:: { Deserialize , Serialize } ;
4+ use std:: { borrow:: Cow , collections:: BTreeMap } ;
55use vrl:: {
66 compiler:: { compile as vrl_compile, Program as VrlProgram , TargetValue as VrlTargetValue } ,
77 core:: Value as VrlValue ,
88 prelude:: {
9- state:: RuntimeState as VrlState , Context as VrlContext , ExpressionError ,
9+ state:: RuntimeState as VrlState , Context as VrlContext , ExpressionError , Function ,
1010 TimeZone as VrlTimeZone ,
1111 } ,
1212 stdlib:: all as vrl_build_functions,
@@ -19,16 +19,17 @@ pub struct Expression {
1919 program : Box < VrlProgram > ,
2020}
2121
22+ static VRL_FUNCTIONS : Lazy < Vec < Box < dyn Function > > > = Lazy :: new ( vrl_build_functions) ;
23+ static VRL_TIMEZONE : Lazy < VrlTimeZone > = Lazy :: new ( VrlTimeZone :: default) ;
24+
2225impl Expression {
2326 pub fn try_new ( expression : String ) -> Result < Self , String > {
24- let vrl_functions = vrl_build_functions ( ) ;
25-
2627 let compilation_result =
27- vrl_compile ( & expression, & vrl_functions ) . map_err ( |diagnostics| {
28+ vrl_compile ( & expression, & VRL_FUNCTIONS ) . map_err ( |diagnostics| {
2829 diagnostics
2930 . errors ( )
30- . into_iter ( )
31- . map ( |d| d . code . to_string ( ) + ": " + & d. message )
31+ . iter ( )
32+ . map ( |d| format ! ( "{}: {}" , d . code , d. message) )
3233 . collect :: < Vec < _ > > ( )
3334 . join ( ", " )
3435 } ) ?;
@@ -39,18 +40,21 @@ impl Expression {
3940 } )
4041 }
4142
42- pub fn execute ( & self , value : VrlValue ) -> Result < VrlValue , ExpressionError > {
43+ pub fn execute_with_value ( & self , value : VrlValue ) -> Result < VrlValue , ExpressionError > {
4344 let mut target = VrlTargetValue {
4445 value,
4546 metadata : VrlValue :: Object ( BTreeMap :: new ( ) ) ,
4647 secrets : VrlSecrets :: default ( ) ,
4748 } ;
4849
4950 let mut state = VrlState :: default ( ) ;
50- let timezone = VrlTimeZone :: default ( ) ;
51- let mut ctx = VrlContext :: new ( & mut target, & mut state, & timezone) ;
51+ let mut ctx = VrlContext :: new ( & mut target, & mut state, & VRL_TIMEZONE ) ;
52+
53+ self . execute_with_context ( & mut ctx)
54+ }
5255
53- self . program . resolve ( & mut ctx)
56+ pub fn execute_with_context ( & self , ctx : & mut VrlContext ) -> Result < VrlValue , ExpressionError > {
57+ self . program . resolve ( ctx)
5458 }
5559}
5660
@@ -59,8 +63,44 @@ impl<'de> Deserialize<'de> for Expression {
5963 where
6064 D : serde:: Deserializer < ' de > ,
6165 {
62- let expression = String :: deserialize ( deserializer) ?;
63- Expression :: try_new ( expression) . map_err ( serde:: de:: Error :: custom)
66+ struct ExpressionVisitor ;
67+ impl < ' de > serde:: de:: Visitor < ' de > for ExpressionVisitor {
68+ type Value = Expression ;
69+
70+ fn expecting ( & self , formatter : & mut std:: fmt:: Formatter ) -> std:: fmt:: Result {
71+ formatter. write_str ( "a map for Expression" )
72+ }
73+
74+ fn visit_map < A > ( self , mut map : A ) -> Result < Self :: Value , A :: Error >
75+ where
76+ A : serde:: de:: MapAccess < ' de > ,
77+ {
78+ let mut expression_str: Option < String > = None ;
79+
80+ while let Some ( key) = map. next_key :: < String > ( ) ? {
81+ match key. as_str ( ) {
82+ "expression" => {
83+ if expression_str. is_some ( ) {
84+ return Err ( serde:: de:: Error :: duplicate_field ( "expression" ) ) ;
85+ }
86+ expression_str = Some ( map. next_value ( ) ?) ;
87+ }
88+ other_key => {
89+ return Err ( serde:: de:: Error :: unknown_field (
90+ other_key,
91+ & [ "expression" ] ,
92+ ) ) ;
93+ }
94+ }
95+ }
96+
97+ let expression_str =
98+ expression_str. ok_or_else ( || serde:: de:: Error :: missing_field ( "expression" ) ) ?;
99+
100+ Expression :: try_new ( expression_str) . map_err ( serde:: de:: Error :: custom)
101+ }
102+ }
103+ deserializer. deserialize_map ( ExpressionVisitor )
64104 }
65105}
66106
0 commit comments