Macro relay_protocol::get_path
source · macro_rules! get_path { (@access $root:ident,) => { ... }; (@access $root:ident, !) => { ... }; (@access $root:ident, . $field:ident $( $tail:tt )*) => { ... }; (@access $root:ident, [ $index:literal ] $( $tail:tt )*) => { ... }; ($root:ident $( $tail:tt )*) => { ... }; }
Expand description
Returns a reference to the typed Annotated
value at a given path.
The return type depends on the path expression used. By default, this macro will resolve to an
Option<&Annotated<T>>
, where the option is Some
if the path exists. Note that if the
annotated value at the specificed path is empty, this returns Some
with an empty annotated.
When used with an exclamation mark after the path, this macro unwraps to an &Annotated<T>
.
§Syntax
A path starts with the name of a variable holding an Annotated
. Access to children of this
type depend on the value type:
- To access a struct field, use a period followed by the field’s name, for instance (
.field
). - To access an array element, use the element’s numeric index in brackets, for instance
[0]
. - To access an object’s element, use the element’s quoted string key in brackets, for instance
["key_name"]
.
Paths can be chained, so a valid path expression is data.values["key"].field
.
To unwrap the annotated field at the destination, append an exclamation mark at the end of the
path, for instance: data.field!
.
§Panics
Panics when unwrap (!
) is used and there is an empty field along the path. Since get_path!
always returns the final Annotated
, the final field can be empty without panicking.
§Example
use relay_protocol::{get_path, Annotated, Object};
struct Inner {
value: Annotated<u64>,
}
struct Outer {
inners: Annotated<Object<Inner>>,
}
let outer = Annotated::new(Outer {
inners: Annotated::new(Object::from([(
"key".to_string(),
Annotated::new(Inner {
value: Annotated::new(1),
}),
)])),
});
assert_eq!(get_path!(outer.inners["key"].value), Some(&Annotated::new(1)));
assert_eq!(get_path!(outer.inners["key"].value!), &Annotated::new(1));