From b6174cff80ca3d005fd58d9d2ba545bb382b8552 Mon Sep 17 00:00:00 2001 From: Brummel Date: Sun, 14 Jun 2026 10:35:52 +0200 Subject: [PATCH] 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. --- crates/aura-cli/src/main.rs | 56 +++++++++++++++---------------- crates/aura-engine/src/builder.rs | 40 +++++++++++----------- 2 files changed, 48 insertions(+), 48 deletions(-) diff --git a/crates/aura-cli/src/main.rs b/crates/aura-cli/src/main.rs index 098ef07..361d347 100644 --- a/crates/aura-cli/src/main.rs +++ b/crates/aura-cli/src/main.rs @@ -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") } diff --git a/crates/aura-engine/src/builder.rs b/crates/aura-engine/src/builder.rs index 2260be4..8c049c4 100644 --- a/crates/aura-engine/src/builder.rs +++ b/crates/aura-engine/src/builder.rs @@ -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` 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() })