Skip to content

Commit 7d23fee

Browse files
committed
feat: debug-only type verification for materialized values
1 parent d9ba7d9 commit 7d23fee

5 files changed

Lines changed: 604 additions & 18 deletions

File tree

crates/plotnik-cli/src/commands/exec.rs

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ use plotnik_lib::emit::emit_linked;
77
use plotnik_lib::Colors;
88
use plotnik_lib::QueryBuilder;
99

10-
use plotnik_lib::engine::{FuelLimits, Materializer, RuntimeError, ValueMaterializer, VM};
10+
use plotnik_lib::engine::{
11+
debug_verify_type, FuelLimits, Materializer, RuntimeError, ValueMaterializer, VM,
12+
};
1113

1214
use super::query_loader::load_query_source;
1315
use super::run_common;
@@ -34,14 +36,14 @@ pub fn run(args: ExecArgs) {
3436
std::process::exit(1);
3537
}
3638

37-
let source_map =
38-
match load_query_source(args.query_path.as_deref(), args.query_text.as_deref()) {
39-
Ok(map) => map,
40-
Err(msg) => {
41-
eprintln!("error: {}", msg);
42-
std::process::exit(1);
43-
}
44-
};
39+
let source_map = match load_query_source(args.query_path.as_deref(), args.query_text.as_deref())
40+
{
41+
Ok(map) => map,
42+
Err(msg) => {
43+
eprintln!("error: {}", msg);
44+
std::process::exit(1);
45+
}
46+
};
4547

4648
if source_map.is_empty() {
4749
eprintln!("error: query cannot be empty");
@@ -96,6 +98,10 @@ pub fn run(args: ExecArgs) {
9698
let value = materializer.materialize(effects.as_slice(), entrypoint.result_type);
9799

98100
let colors = Colors::new(args.color);
101+
102+
// Debug-only: verify output matches declared type
103+
debug_verify_type(&value, &module, colors);
104+
99105
let output = value.format(args.pretty, colors);
100106
println!("{}", output);
101107
}

crates/plotnik-cli/src/commands/trace.rs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ use plotnik_lib::Colors;
88
use plotnik_lib::QueryBuilder;
99

1010
use plotnik_lib::engine::{
11-
FuelLimits, Materializer, PrintTracer, RuntimeError, ValueMaterializer, Verbosity, VM,
11+
debug_verify_type, FuelLimits, Materializer, PrintTracer, RuntimeError, ValueMaterializer,
12+
Verbosity, VM,
1213
};
1314

1415
use super::query_loader::load_query_source;
@@ -38,14 +39,14 @@ pub fn run(args: TraceArgs) {
3839
std::process::exit(1);
3940
}
4041

41-
let source_map =
42-
match load_query_source(args.query_path.as_deref(), args.query_text.as_deref()) {
43-
Ok(map) => map,
44-
Err(msg) => {
45-
eprintln!("error: {}", msg);
46-
std::process::exit(1);
47-
}
48-
};
42+
let source_map = match load_query_source(args.query_path.as_deref(), args.query_text.as_deref())
43+
{
44+
Ok(map) => map,
45+
Err(msg) => {
46+
eprintln!("error: {}", msg);
47+
std::process::exit(1);
48+
}
49+
};
4950

5051
if source_map.is_empty() {
5152
eprintln!("error: query cannot be empty");
@@ -116,6 +117,9 @@ pub fn run(args: TraceArgs) {
116117
let materializer = ValueMaterializer::new(&source_code, module.types(), module.strings());
117118
let value = materializer.materialize(effects.as_slice(), entrypoint.result_type);
118119

120+
// Debug-only: verify output matches declared type
121+
debug_verify_type(&value, &module, colors);
122+
119123
let output = value.format(true, colors);
120124
println!("{}", output);
121125
}

crates/plotnik-lib/src/engine/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ mod frame;
1111
mod materializer;
1212
mod trace;
1313
mod value;
14+
mod verify;
1415
mod vm;
1516

1617
#[cfg(test)]
@@ -21,4 +22,5 @@ pub use error::RuntimeError;
2122
pub use materializer::{Materializer, ValueMaterializer};
2223
pub use trace::{PrintTracer, Tracer, Verbosity};
2324
pub use value::{NodeHandle, Value};
25+
pub use verify::debug_verify_type;
2426
pub use vm::{FuelLimits, VM};

0 commit comments

Comments
 (0)