@@ -168,17 +168,21 @@ impl Query {
168168 let o = Item :: Obj ( var. clone ( ) ) ;
169169 let mut r = Mapping :: new ( ) ;
170170 for ( n, node) in & exports. exports {
171- let m = node
172- . merged ( exports. reclass . unwrap ( ) )
173- . map_err ( |e| anyhow ! ( "while rendering exports for {n}: {e}" ) ) ?;
174- let n_exports = m. get_exports ( ) ;
171+ let m = node. merged ( exports. reclass . unwrap ( ) ) ;
172+ let n_exports = if let Ok ( merged) = m. as_ref ( ) {
173+ merged. get_exports ( )
174+ } else if self . ignore_errors {
175+ & Mapping :: new ( )
176+ } else {
177+ return Err ( m. err ( ) . unwrap ( ) ) ;
178+ } ;
175179 let nv = o
176- . value ( n_exports, self . ignore_errors )
180+ . value ( n_exports, true )
177181 . map_err ( |e| anyhow ! ( "while evaluating export value for {n}: {e}" ) ) ?;
178182 eprintln ! ( "Got value {nv:?} for export {} for node {n}" , self . qstr) ;
179183 if let Some ( e) = self . expr . as_ref ( ) {
180184 let ee = e
181- . evaluate ( n_exports, self . ignore_errors )
185+ . evaluate ( n_exports, true )
182186 . map_err ( |e| anyhow ! ( "while evaluating export expression for {n}: {e}" ) ) ?;
183187 eprintln ! ( "evaluating expr {e:?} with {n_exports:?}: {ee}" ) ;
184188 if ee {
@@ -295,12 +299,13 @@ mod invqueries_test {
295299 }
296300
297301 #[ test]
298- fn test_resolve_simple_errors_1 ( ) {
302+ fn test_resolve_missing_export_1 ( ) {
299303 let qstr = " exports:n1 " ;
300304 let q = Query :: parse ( qstr) . unwrap ( ) ;
301305 let mut exports = Exports :: default ( ) ;
302306 let r = Reclass :: new ( "./tests/inventory" , "nodes" , "classes" , false ) . unwrap ( ) ;
303307 exports. reclass = Some ( & r) ;
308+ let mut expected = Mapping :: new ( ) ;
304309 for n in [ "n1" , "n2" , "n3" ] {
305310 let node = make_node (
306311 n,
@@ -312,11 +317,94 @@ mod invqueries_test {
312317 ) ,
313318 ) ;
314319 exports. exports . insert ( n. into ( ) , node) ;
320+ if n == "n1" {
321+ expected
322+ . insert ( n. into ( ) , Value :: Literal ( "bar" . to_owned ( ) ) )
323+ . unwrap ( ) ;
324+ }
325+ }
326+ let v = q. resolve ( & exports) . unwrap ( ) ;
327+ assert_eq ! ( v, Value :: Mapping ( expected) ) ;
328+ }
329+
330+ #[ test]
331+ fn test_resolve_errors_1 ( ) {
332+ let qstr = " exports:n1 " ;
333+ let q = Query :: parse ( qstr) . unwrap ( ) ;
334+ let mut exports = Exports :: default ( ) ;
335+ let r = Reclass :: new ( "./tests/inventory" , "nodes" , "classes" , false ) . unwrap ( ) ;
336+ exports. reclass = Some ( & r) ;
337+ for n in [ "n1" , "n2" , "n3" ] {
338+ let node = if n == "n3" {
339+ make_node (
340+ n,
341+ & format ! (
342+ r#"
343+ classes:
344+ - notexisting
345+ exports:
346+ {n}: bar
347+ "#
348+ ) ,
349+ )
350+ } else {
351+ make_node (
352+ n,
353+ & format ! (
354+ r#"
355+ exports:
356+ {n}: bar
357+ "#
358+ ) ,
359+ )
360+ } ;
361+ exports. exports . insert ( n. into ( ) , node) ;
315362 }
316363 let v = q. resolve ( & exports) ;
317364 assert ! ( v. is_err( ) ) ;
318365 }
319366
367+ #[ test]
368+ fn test_resolve_ignore_errors_1 ( ) {
369+ let qstr = " +IgnoreErrors exports:foo " ;
370+ let q = Query :: parse ( qstr) . unwrap ( ) ;
371+ let mut exports = Exports :: default ( ) ;
372+ let r = Reclass :: new ( "./tests/inventory" , "nodes" , "classes" , false ) . unwrap ( ) ;
373+ exports. reclass = Some ( & r) ;
374+ let mut expected = Mapping :: new ( ) ;
375+ for n in [ "n1" , "n2" , "n3" ] {
376+ let node = if n == "n3" {
377+ make_node (
378+ n,
379+ & format ! (
380+ r#"
381+ classes:
382+ - notexisting
383+ exports:
384+ {n}: bar
385+ "#
386+ ) ,
387+ )
388+ } else {
389+ make_node (
390+ n,
391+ r#"
392+ exports:
393+ foo: bar
394+ "# ,
395+ )
396+ } ;
397+ exports. exports . insert ( n. into ( ) , node) ;
398+ if n != "n3" {
399+ expected
400+ . insert ( n. into ( ) , Value :: Literal ( "bar" . to_owned ( ) ) )
401+ . unwrap ( ) ;
402+ }
403+ }
404+ let v = q. resolve ( & exports) . unwrap ( ) ;
405+ assert_eq ! ( v, Value :: Mapping ( expected) ) ;
406+ }
407+
320408 #[ test]
321409 fn test_resolve_cond_1 ( ) {
322410 let qstr = " exports:foo if exports:foo != n3 " ;
0 commit comments