refactor(aura-engine): rename NodeHandle::in_/out to input/output

The trailing underscore on in_() was a keyword-escape scar (`in` is reserved).
Rename the NodeHandle port/field accessors to input()/output(), which also
aligns the authoring surface with the schema's own nomenclature
(NodeSchema.inputs/output, "input port"/"output field"): node.input("lhs")
now reads in the same vocabulary the schema uses, instead of a second one.

Mechanical, behaviour-preserving: the two method definitions plus every call
site in builder.rs and the aura-cli sample blueprints. Full workspace green;
clippy --all-targets -D warnings clean.
This commit is contained in:
2026-06-14 10:35:52 +02:00
parent 50105c1957
commit b6174cff80
2 changed files with 48 additions and 48 deletions
+28 -28
View File
@@ -156,10 +156,10 @@ fn sma_cross(name: &str) -> Composite {
let slow = g.add(Sma::builder().named("slow")); // slow SMA leg
let sub = g.add(Sub::builder());
let price = g.input_role("price");
g.feed(price, [fast.in_("series"), slow.in_("series")]);
g.connect(fast.out("value"), sub.in_("lhs"));
g.connect(slow.out("value"), sub.in_("rhs"));
g.expose(sub.out("value"), "cross");
g.feed(price, [fast.input("series"), slow.input("series")]);
g.connect(fast.output("value"), sub.input("lhs"));
g.connect(slow.output("value"), sub.input("rhs"));
g.expose(sub.output("value"), "cross");
g.build().expect("sample sma_cross wiring resolves")
}
@@ -181,11 +181,11 @@ fn signals(name: &str) -> Composite {
.bind("weights[2]", Scalar::F64(0.5)),
);
let price = g.input_role("price");
g.feed(price, [trend.in_("price"), momentum.in_("price")]);
g.connect(trend.out("cross"), blend.in_("term[0]")); // trend.cross → blend.term[0]
g.connect(momentum.out("histogram"), blend.in_("term[1]")); // momentum.histogram → blend.term[1]
g.connect(momentum.out("signal"), blend.in_("term[2]")); // momentum.signal → blend.term[2]
g.expose(blend.out("value"), "signal");
g.feed(price, [trend.input("price"), momentum.input("price")]);
g.connect(trend.output("cross"), blend.input("term[0]")); // trend.cross → blend.term[0]
g.connect(momentum.output("histogram"), blend.input("term[1]")); // momentum.histogram → blend.term[1]
g.connect(momentum.output("signal"), blend.input("term[2]")); // momentum.signal → blend.term[2]
g.expose(blend.output("value"), "signal");
g.build().expect("sample signals wiring resolves")
}
@@ -211,11 +211,11 @@ fn sample_blueprint_with_sinks() -> (
let eq = g.add(Recorder::builder(vec![ScalarKind::F64], Firing::Any, tx_eq));
let ex = g.add(Recorder::builder(vec![ScalarKind::F64], Firing::Any, tx_ex));
let price = g.source_role("price", ScalarKind::F64);
g.feed(price, [sig.in_("price"), broker.in_("price")]);
g.connect(sig.out("signal"), exposure.in_("signal")); // blended signal -> Exposure
g.connect(exposure.out("exposure"), broker.in_("exposure")); // exposure -> broker slot 0
g.connect(broker.out("equity"), eq.in_("col[0]")); // equity -> sink
g.connect(exposure.out("exposure"), ex.in_("col[0]")); // exposure -> sink
g.feed(price, [sig.input("price"), broker.input("price")]);
g.connect(sig.output("signal"), exposure.input("signal")); // blended signal -> Exposure
g.connect(exposure.output("exposure"), broker.input("exposure")); // exposure -> broker slot 0
g.connect(broker.output("equity"), eq.input("col[0]")); // equity -> sink
g.connect(exposure.output("exposure"), ex.input("col[0]")); // exposure -> sink
let bp = g.build().expect("sample blueprint wiring resolves");
(bp, rx_eq, rx_ex)
}
@@ -371,15 +371,15 @@ fn macd(name: &str) -> Composite {
let signal = g.add(Ema::builder().named("signal")); // signal EMA of the MACD line
let hist = g.add(Sub::builder()); // histogram = MACD line signal
let price = g.input_role("price");
g.feed(price, [fast.in_("series"), slow.in_("series")]);
g.connect(fast.out("value"), line.in_("lhs")); // fast → line
g.connect(slow.out("value"), line.in_("rhs")); // slow → line
g.connect(line.out("value"), signal.in_("series")); // line → signal EMA
g.connect(line.out("value"), hist.in_("lhs")); // line → histogram
g.connect(signal.out("value"), hist.in_("rhs")); // signal → histogram
g.expose(line.out("value"), "macd"); // the MACD line
g.expose(signal.out("value"), "signal"); // the signal line
g.expose(hist.out("value"), "histogram"); // the histogram
g.feed(price, [fast.input("series"), slow.input("series")]);
g.connect(fast.output("value"), line.input("lhs")); // fast → line
g.connect(slow.output("value"), line.input("rhs")); // slow → line
g.connect(line.output("value"), signal.input("series")); // line → signal EMA
g.connect(line.output("value"), hist.input("lhs")); // line → histogram
g.connect(signal.output("value"), hist.input("rhs")); // signal → histogram
g.expose(line.output("value"), "macd"); // the MACD line
g.expose(signal.output("value"), "signal"); // the signal line
g.expose(hist.output("value"), "histogram"); // the histogram
g.build().expect("sample macd wiring resolves")
}
@@ -397,11 +397,11 @@ fn macd_strategy_blueprint(
let eq = g.add(Recorder::builder(vec![ScalarKind::F64], Firing::Any, tx_eq));
let ex = g.add(Recorder::builder(vec![ScalarKind::F64], Firing::Any, tx_ex));
let price = g.source_role("price", ScalarKind::F64);
g.feed(price, [macd_node.in_("price"), broker.in_("price")]);
g.connect(macd_node.out("histogram"), exposure.in_("signal")); // histogram → Exposure
g.connect(exposure.out("exposure"), broker.in_("exposure")); // exposure → broker slot 0
g.connect(broker.out("equity"), eq.in_("col[0]")); // equity → sink
g.connect(exposure.out("exposure"), ex.in_("col[0]")); // exposure → sink
g.feed(price, [macd_node.input("price"), broker.input("price")]);
g.connect(macd_node.output("histogram"), exposure.input("signal")); // histogram → Exposure
g.connect(exposure.output("exposure"), broker.input("exposure")); // exposure → broker slot 0
g.connect(broker.output("equity"), eq.input("col[0]")); // equity → sink
g.connect(exposure.output("exposure"), ex.input("col[0]")); // exposure → sink
g.build().expect("macd_strategy wiring resolves")
}
+20 -20
View File
@@ -38,11 +38,11 @@ pub struct OutPort {
impl NodeHandle {
/// Address an input port of this node by name (resolved at [`GraphBuilder::build`]).
pub fn in_(self, name: &'static str) -> InPort {
pub fn input(self, name: &'static str) -> InPort {
InPort { node: self.0, name }
}
/// Address this node's output field by name (resolved at [`GraphBuilder::build`]).
pub fn out(self, name: &'static str) -> OutPort {
pub fn output(self, name: &'static str) -> OutPort {
OutPort { node: self.0, name }
}
}
@@ -214,10 +214,10 @@ mod tests {
let slow = g.add(Sma::builder().named("slow"));
let sub = g.add(Sub::builder());
let price = g.input_role("price");
g.feed(price, [fast.in_("series"), slow.in_("series")]);
g.connect(fast.out("value"), sub.in_("lhs"));
g.connect(slow.out("value"), sub.in_("rhs"));
g.expose(sub.out("value"), "out");
g.feed(price, [fast.input("series"), slow.input("series")]);
g.connect(fast.output("value"), sub.input("lhs"));
g.connect(slow.output("value"), sub.input("rhs"));
g.expose(sub.output("value"), "out");
g.build().expect("sma_cross resolves")
}
@@ -256,11 +256,11 @@ mod tests {
let eq = g.add(Recorder::builder(vec![ScalarKind::F64], Firing::Any, tx_eq));
let ex = g.add(Recorder::builder(vec![ScalarKind::F64], Firing::Any, tx_ex));
let src = g.source_role("src", ScalarKind::F64);
g.feed(src, [xross.in_("price"), broker.in_("price")]);
g.connect(xross.out("out"), expo.in_("signal"));
g.connect(expo.out("exposure"), broker.in_("exposure"));
g.connect(broker.out("equity"), eq.in_("col[0]"));
g.connect(expo.out("exposure"), ex.in_("col[0]"));
g.feed(src, [xross.input("price"), broker.input("price")]);
g.connect(xross.output("out"), expo.input("signal"));
g.connect(expo.output("exposure"), broker.input("exposure"));
g.connect(broker.output("equity"), eq.input("col[0]"));
g.connect(expo.output("exposure"), ex.input("col[0]"));
let built_flat = g
.build()
.expect("root resolves")
@@ -276,7 +276,7 @@ mod tests {
let mut g = GraphBuilder::new("x");
let a = g.add(Sma::builder());
let b = g.add(Sub::builder());
g.connect(a.out("value"), b.in_("nope"));
g.connect(a.output("value"), b.input("nope"));
// `.err()`, not `.unwrap_err()`: the latter would require `Composite: Debug`
// (the Ok type), which it is not (it holds a `Box<dyn Fn>` builder closure).
assert_eq!(
@@ -290,7 +290,7 @@ mod tests {
let mut g = GraphBuilder::new("x");
let a = g.add(Sma::builder());
let b = g.add(Sub::builder());
g.connect(a.out("nope"), b.in_("lhs"));
g.connect(a.output("nope"), b.input("lhs"));
assert_eq!(
g.build().err(),
Some(BuildError::UnknownOutPort { node: 0, name: "nope".into() })
@@ -306,7 +306,7 @@ mod tests {
let third = g1.add(Sub::builder()); // NodeHandle(2)
let mut g2 = GraphBuilder::new("g2");
let only = g2.add(Sub::builder()); // NodeHandle(0)
g2.connect(third.out("value"), only.in_("lhs"));
g2.connect(third.output("value"), only.input("lhs"));
assert_eq!(g2.build().err(), Some(BuildError::BadHandle { node: 2 }));
}
@@ -326,7 +326,7 @@ mod tests {
let mut g = GraphBuilder::new("outer");
let c = g.add(inner);
let src = g.source_role("s", ScalarKind::F64);
g.feed(src, [c.in_("x")]);
g.feed(src, [c.input("x")]);
assert_eq!(
g.build().err(),
Some(BuildError::AmbiguousInPort { node: 0, name: "x".into() })
@@ -349,7 +349,7 @@ mod tests {
let mut g = GraphBuilder::new("outer");
let c = g.add(inner);
let snk = g.add(Sub::builder());
g.connect(c.out("o"), snk.in_("lhs"));
g.connect(c.output("o"), snk.input("lhs"));
assert_eq!(
g.build().err(),
Some(BuildError::AmbiguousOutPort { node: 0, name: "o".into() })
@@ -363,16 +363,16 @@ mod tests {
let expo = ok.add(Exposure::builder());
let broker = ok.add(SimBroker::builder(0.0001));
let src = ok.source_role("p", ScalarKind::F64);
ok.feed(src, [expo.in_("signal"), broker.in_("price")]);
ok.connect(expo.out("exposure"), broker.in_("exposure"));
ok.expose(broker.out("equity"), "eq");
ok.feed(src, [expo.input("signal"), broker.input("price")]);
ok.connect(expo.output("exposure"), broker.input("exposure"));
ok.expose(broker.output("equity"), "eq");
assert!(ok.build().is_ok());
// a transposed/typo'd port name is caught, where a bare slot index is not
let mut typo = GraphBuilder::new("typo");
let expo2 = typo.add(Exposure::builder());
let broker2 = typo.add(SimBroker::builder(0.0001));
typo.connect(expo2.out("exposure"), broker2.in_("pirce"));
typo.connect(expo2.output("exposure"), broker2.input("pirce"));
assert_eq!(
typo.build().err(),
Some(BuildError::UnknownInPort { node: 1, name: "pirce".into() })