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

Function parser_expand

flow-derive/src/internal.rs:133–271  ·  view source on GitHub ↗
(input: DeriveInput)

Source from the content-addressed store, hash-verified

131}
132
133pub fn parser_expand(input: DeriveInput) -> TokenStream {
134 let ident = input.ident;
135 let support_include = fields(&input.data).any(|field| {
136 field
137 .ident
138 .as_ref()
139 .map(|x| x == "include")
140 .unwrap_or(false)
141 });
142 if support_include {
143 let list: Vec<_> = fields(&input.data)
144 .filter(|field| {
145 match_last_ty(&field.ty, "Vec")
146 || match_last_ty(&field.ty, "VecDeque")
147 || match_last_ty(&field.ty, "LinkedList")
148 })
149 .map(|field| {
150 let ident = &field.ident;
151 quote_spanned! { ident.span()=>
152 config.#ident.append(&mut sub_config.#ident);
153 }
154 })
155 .collect();
156 let set: Vec<_> = fields(&input.data)
157 .filter(|field| {
158 match_last_ty(&field.ty, "HashSet") || match_last_ty(&field.ty, "BTreeSet")
159 })
160 .map(|field| {
161 let ident = &field.ident;
162 quote_spanned! {ident.span()=>
163 for x in std::mem::take(&mut sub_config.#ident) {
164 config.#ident.insert(x);
165 }
166 }
167 })
168 .collect();
169 let map: Vec<_> = fields(&input.data)
170 .filter(|field| {
171 match_last_ty(&field.ty, "HashMap") || match_last_ty(&field.ty, "BTreeMap")
172 })
173 .map(|field| {
174 let ident = &field.ident;
175 quote_spanned! {ident.span()=>
176 for (k, v) in std::mem::take(&mut sub_config.#ident) {
177 config.#ident.entry(k).or_insert(v);
178 }
179 }
180 })
181 .collect();
182 quote! {
183 type PathSet = std::collections::BTreeSet<std::path::PathBuf>;
184 impl<'a> #ident {
185 fn from_impl(path: &std::path::Path, template: &str, dynamic: &templar::InnerData, mut visit: PathSet) -> anyhow::Result<(#ident, PathSet)> {
186 use templar::Context;
187
188 let template = flow_rs::config::parser::TEMPLAR.parse_template(template)?;
189 let context = templar::StandardContext::new();
190 context.set(dynamic.clone())?;

Callers 1

parser_deriveFunction · 0.85

Calls 4

fieldsFunction · 0.85
match_last_tyFunction · 0.85
as_refMethod · 0.80
filterMethod · 0.80

Tested by

no test coverage detected