(input: DeriveInput)
| 15 | use syn::{spanned::Spanned, DeriveInput}; |
| 16 | |
| 17 | pub fn expand(input: DeriveInput) -> TokenStream { |
| 18 | let ident = input.ident; |
| 19 | let is_local = attr(&input.attrs, "local").is_some(); |
| 20 | let spawn_func = if is_local { |
| 21 | lit::ident("spawn_local") |
| 22 | } else { |
| 23 | lit::ident("spawn") |
| 24 | }; |
| 25 | |
| 26 | fn send_empty_f((_, ident, ty): ExtractParams) -> TokenStream { |
| 27 | if match_last_ty(ty, "Vec") { |
| 28 | quote_spanned! {ident.span()=> |
| 29 | for chan in &self.#ident { |
| 30 | chan.send_any(flow_rs::envelope::DummyEnvelope{}.seal()).await.ok(); |
| 31 | } |
| 32 | } |
| 33 | } else if match_last_ty(ty, "HashMap") { |
| 34 | quote_spanned! {ident.span()=> |
| 35 | for chan in self.#ident.values() { |
| 36 | chan.send_any(flow_rs::envelope::DummyEnvelope{}.seal()).await.ok(); |
| 37 | } |
| 38 | } |
| 39 | } else if match_last_ty(ty, "DynPorts") { |
| 40 | quote_spanned! (ident.span()=> |
| 41 | for chan in self.#ident.cache().values() { |
| 42 | chan.send_any(flow_rs::envelope::DummyEnvelope{}.seal()).await.ok(); |
| 43 | } |
| 44 | ) |
| 45 | } else { |
| 46 | quote_spanned! (ident.span()=>self.#ident.send_any(flow_rs::envelope::DummyEnvelope{}.seal()).await.ok();) |
| 47 | } |
| 48 | } |
| 49 | fn min_empty_n_f((_, ident, ty): ExtractParams) -> TokenStream { |
| 50 | if match_last_ty(ty, "Vec") { |
| 51 | quote_spanned! {ident.span()=> |
| 52 | for chan in &self.#ident { |
| 53 | min_empty_n = std::cmp::min(chan.empty_n(), min_empty_n) |
| 54 | } |
| 55 | } |
| 56 | } else if match_last_ty(ty, "HashMap") { |
| 57 | quote_spanned! {ident.span()=> |
| 58 | for chan in self.#ident.values() { |
| 59 | min_empty_n = std::cmp::min(chan.empty_n(), min_empty_n) |
| 60 | } |
| 61 | } |
| 62 | } else if match_last_ty(ty, "DynPorts") { |
| 63 | quote_spanned! (ident.span()=> |
| 64 | for chan in self.#ident.cache().values() { |
| 65 | min_empty_n = std::cmp::min(chan.empty_n(), min_empty_n) |
| 66 | } |
| 67 | ) |
| 68 | } else { |
| 69 | quote_spanned! (ident.span()=> min_empty_n = std::cmp::min(self.#ident.empty_n(), min_empty_n);) |
| 70 | } |
| 71 | } |
| 72 | |
| 73 | let send_empty = extract_ports(&input.data, type_name::OUT_T, send_empty_f); |
| 74 | let recv_empty_n = extract_ports(&input.data, type_name::IN_T, min_empty_n_f); |
nothing calls this directly
no test coverage detected