(input: DeriveInput)
| 131 | } |
| 132 | |
| 133 | pub 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())?; |
no test coverage detected