const STATE: &str = "__state_";
const INPUT: &str = "__input_";
pub const GRAPH_INPUT: &str = "__input__";
pub fn state_key(node_id: &str) -> String {
format!("{STATE}{node_id}")
}
pub fn input_key(node_id: &str) -> String {
format!("{INPUT}{node_id}")
}
pub fn node_of_state_key(key: &str) -> Option<&str> {
key.strip_prefix(STATE)
}
pub fn is_input_key(key: &str) -> bool {
key == GRAPH_INPUT || key.starts_with(INPUT)
}
pub fn is_reserved(key: &str) -> bool {
key == GRAPH_INPUT || key.starts_with(STATE) || key.starts_with(INPUT)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn state_keys_round_trip() {
let key = state_key("scaler");
assert_eq!(node_of_state_key(&key), Some("scaler"));
assert!(is_reserved(&key));
}
#[test]
fn an_ordinary_node_id_is_not_a_state_key() {
assert_eq!(node_of_state_key("scaler"), None);
assert!(!is_reserved("scaler"));
}
#[test]
fn every_reserved_shape_is_recognised() {
assert!(is_reserved(GRAPH_INPUT));
assert!(is_reserved(&input_key("model")));
assert!(is_reserved(&state_key("model")));
}
}