MCPcopy Create free account
hub / github.com/MegEngine/MegFlow / expand

Function expand

flow-derive/src/actor.rs:17–108  ·  view source on GitHub ↗
(input: DeriveInput)

Source from the content-addressed store, hash-verified

15use syn::{spanned::Spanned, DeriveInput};
16
17pub 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);

Callers

nothing calls this directly

Calls 5

attrFunction · 0.85
identFunction · 0.85
extract_portsFunction · 0.85
is_someMethod · 0.80
lenMethod · 0.45

Tested by

no test coverage detected