graphforge_ir/procedure.rs
1//! Procedure signatures and deterministic procedure fixtures.
2
3use std::collections::HashMap;
4
5use serde::{Deserialize, Serialize};
6
7use crate::{IrLiteral, VarId};
8
9/// A named value in a procedure signature.
10#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
11pub struct ProcedureField {
12 /// Field name used for implicit arguments or yielded values.
13 pub name: String,
14 /// openCypher type name, retained for compile-time validation.
15 pub type_name: String,
16 /// Whether the field accepts null.
17 pub nullable: bool,
18}
19
20/// A deterministic procedure definition used by query planning and the TCK.
21#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
22pub struct ProcedureDefinition {
23 /// Fully-qualified procedure name.
24 pub name: String,
25 /// Ordered input signature.
26 pub inputs: Vec<ProcedureField>,
27 /// Ordered output signature.
28 pub outputs: Vec<ProcedureField>,
29 /// Fixture rows containing all inputs followed by all outputs.
30 pub rows: Vec<Vec<IrLiteral>>,
31}
32
33/// Procedure definitions keyed by fully-qualified name.
34pub type ProcedureRegistry = HashMap<String, ProcedureDefinition>;
35
36/// One output selected by a `YIELD` list.
37#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
38pub struct ProcedureYield {
39 /// Name in the registered procedure output signature.
40 pub field: String,
41 /// Query-visible name after an optional `AS` alias.
42 pub alias: String,
43 /// Variable introduced into the downstream query scope.
44 pub var: VarId,
45}