///|
pub(all) struct DistantSignalLinkage {
distant_signal_id : @topology.SignalId
home_signal_id : @topology.SignalId
} derive(Debug)
///|
pub fn update_distant_signal_linkage(
station : @topology.Station,
linkage : DistantSignalLinkage,
) -> Result[Unit, String] {
match station.graph.get_signal(linkage.home_signal_id) {
None => Err("Home signal not found")
Some(home_sig) => {
let distant_aspect = match home_sig.current_aspect {
Red => @topology.SignalAspect::Yellow
Yellow => @topology.SignalAspect::Green
Green => @topology.SignalAspect::Green
DoubleYellow => @topology.SignalAspect::YellowGreen
_ => @topology.SignalAspect::Yellow
}
station.set_signal_aspect(linkage.distant_signal_id, distant_aspect)
}
}
}
///|
pub fn determine_signal_aspect_for_route(
route_type : RouteType,
is_diverging : Bool,
exit_signal_aspect : @topology.SignalAspect,
) -> @topology.SignalAspect {
match route_type {
ShuntingRoute => @topology.SignalAspect::White
ReceivingRoute =>
if is_diverging {
@topology.SignalAspect::DoubleYellow
} else {
match exit_signal_aspect {
Red => @topology.SignalAspect::Yellow
_ => @topology.SignalAspect::Green
}
}
DepartureRoute => @topology.SignalAspect::Green
PassingRoute =>
if is_diverging {
@topology.SignalAspect::DoubleYellow
} else {
@topology.SignalAspect::Green
}
}
}