1mod constant;
2pub use constant::Opcode;
3
4#[derive(Debug)]
5pub struct Explanation {
6 pub table: Option<sqlite_table::Table>,
7}
8
9#[derive(Debug)]
10pub struct Instr {
11 pub addr: i32,
12 pub comment: Option<String>,
13 pub opcode: Opcode,
14 pub p1: serde_json::Value,
15 pub p2: serde_json::Value,
16 pub p3: serde_json::Value,
17 pub p4: serde_json::Value,
18 pub p5: serde_json::Value,
19}
20
21pub fn explain(program: Vec<Instr>, schemas: &sqlite_table::Schemas) -> Explanation {
22 let mut table = None;
23
24 for instr in program {
25 if matches!(
26 instr.opcode,
27 Opcode::OpenRead | Opcode::OpenWrite | Opcode::ReopenIdx
28 ) {
29 let id = match instr.p2 {
30 serde_json::value::Value::Number(n) => n.as_u64().unwrap_or_default() as usize,
31 _ => unreachable!(),
32 };
33
34 table = sqlite_table::find_table_by_root(id, schemas);
35 }
36 }
37
38 Explanation { table }
39}