|
1 | 1 | use crate::args::{PartialArg, SerdeContainerArgs, SerdeRenameArg}; |
2 | 2 | use crate::field::Field; |
3 | | -use crate::utils::{ImplResult, is_inheritable_attribute}; |
| 3 | +use crate::utils::{ImplResult, is_inheritable_attribute, to_type_string}; |
4 | 4 | use crate::variant::Variant; |
5 | 5 | use darling::FromDeriveInput; |
6 | 6 | use proc_macro2::TokenStream; |
@@ -226,10 +226,75 @@ impl Container { |
226 | 226 | } |
227 | 227 | } |
228 | 228 |
|
229 | | - // TODO |
230 | 229 | pub fn impl_full_settings(&self) -> TokenStream { |
| 230 | + let mut settings = vec![]; |
| 231 | + |
| 232 | + match &self.inner { |
| 233 | + ContainerInner::NamedStruct { fields } | ContainerInner::UnnamedStruct { fields } => { |
| 234 | + for field in fields { |
| 235 | + let name = if field.ident.is_some() { |
| 236 | + field.get_name() |
| 237 | + } else { |
| 238 | + field.index.to_string() |
| 239 | + }; |
| 240 | + let env_key = if let Some(value) = field.get_env_var() { |
| 241 | + quote! { .env(#value) } |
| 242 | + } else { |
| 243 | + quote! {} |
| 244 | + }; |
| 245 | + let nested = if field.is_nested() { |
| 246 | + let value = field.value.get_inner_type(); |
| 247 | + quote! { .nested(#value::settings()) } |
| 248 | + } else { |
| 249 | + quote! {} |
| 250 | + }; |
| 251 | + let type_alias = to_type_string(field.value.ty.to_token_stream()); |
| 252 | + |
| 253 | + settings.push(quote! { |
| 254 | + (#name.into(), ConfigSetting::new(#type_alias) |
| 255 | + #env_key |
| 256 | + #nested |
| 257 | + ), |
| 258 | + }); |
| 259 | + } |
| 260 | + } |
| 261 | + ContainerInner::UnnamedEnum { variants } => { |
| 262 | + for variant in variants { |
| 263 | + let name = variant.get_name(); |
| 264 | + let type_alias = to_type_string( |
| 265 | + variant |
| 266 | + .values |
| 267 | + .iter() |
| 268 | + .map(|v| v.ty.to_token_stream()) |
| 269 | + .collect::<Vec<_>>() |
| 270 | + .into_iter() |
| 271 | + .collect::<TokenStream>(), |
| 272 | + ); |
| 273 | + |
| 274 | + settings.push(quote! { |
| 275 | + (#name.into(), ConfigSetting::new(#type_alias)), |
| 276 | + }); |
| 277 | + } |
| 278 | + } |
| 279 | + ContainerInner::UnitEnum { variants } => { |
| 280 | + for variant in variants { |
| 281 | + let name = variant.get_name(); |
| 282 | + |
| 283 | + settings.push(quote! { |
| 284 | + (#name.into(), ConfigSetting::new(#name)), |
| 285 | + }); |
| 286 | + } |
| 287 | + } |
| 288 | + }; |
| 289 | + |
231 | 290 | quote! { |
232 | | - fn settings() -> schematic::ConfigSettingMap {} |
| 291 | + fn settings() -> schematic::ConfigSettingMap { |
| 292 | + use schematic::ConfigSetting; |
| 293 | + |
| 294 | + std::collections::BTreeMap::from_iter([ |
| 295 | + #(#settings)* |
| 296 | + ]) |
| 297 | + } |
233 | 298 | } |
234 | 299 | } |
235 | 300 |
|
|
0 commit comments