macro_rules! cached { ($cachename:ident; fn $name:ident ($($arg:ident : $argtype:ty),*) -> $ret:ty = $body:expr) => { ... }; ($cachename:ident : $cachetype:ty = $cacheinstance:expr ; fn $name:ident ($($arg:ident : $argtype:ty),*) -> $ret:ty = $body:expr) => { ... }; ($cachename:ident : $cachetype:ty = $cacheinstance:expr ; async fn $name:ident ($($arg:ident : $argtype:ty),*) -> $ret:ty = $body:block) => { ... }; }