use proc_macro2::TokenStream;
use quote::quote;
use syn::LitStr;
use crate::args::Args;
pub(super) fn save_methods(save: bool, key: &LitStr) -> TokenStream {
if save {
quote! {
pub fn save(
&self,
path: impl ::core::convert::AsRef<::std::path::Path>,
) -> ::core::result::Result<(), ::dynamic_config::Error> {
let path = path.as_ref();
let format = ::dynamic_config::Format::from_path(path)?;
::dynamic_config::save(self, path, format, #key)
}
pub fn save_new(
&self,
path: impl ::core::convert::AsRef<::std::path::Path>,
) -> ::core::result::Result<(), ::dynamic_config::Error> {
let path = path.as_ref();
let format = ::dynamic_config::Format::from_path(path)?;
::dynamic_config::save_new(self, path, format, #key)
}
::dynamic_config::__save_encrypted_method!(#key);
}
} else {
quote! {}
}
}
pub(super) fn cache_const(args: &Args, secret_names: &[String]) -> TokenStream {
match &args.cache {
Some(path) => {
let mode = args
.cache_mode
.as_ref()
.map_or_else(|| "full".to_owned(), syn::LitStr::value);
quote! {
const DYNAMIC_CONFIG_CACHE: ::core::option::Option<(
&'static str,
&'static str,
&'static [&'static str],
)> = ::core::option::Option::Some((
#path,
#mode,
&[#(#secret_names),*],
));
}
}
None => quote! {
const DYNAMIC_CONFIG_CACHE: ::core::option::Option<(
&'static str,
&'static str,
&'static [&'static str],
)> = ::core::option::Option::None;
},
}
}
pub(super) fn apply_body(diff: bool) -> TokenStream {
if diff {
quote! {
let current = ::dynamic_config::snapshot(&Self::dynamic_config_spec())?;
let config = match current.extract::<Self>() {
::core::result::Result::Ok(config) => Self::dynamic_config_validate(config)?,
::core::result::Result::Err(_) => Self::load()?,
};
let previous = Self::dynamic_config_previous()
.lock()
.unwrap_or_else(::std::sync::PoisonError::into_inner)
.replace(current.clone());
Self::replace(config);
::dynamic_config::__write_cache(¤t, Self::DYNAMIC_CONFIG_CACHE);
::core::result::Result::Ok(
previous.map(|previous| {
::dynamic_config::__summarize_changes(&previous, ¤t)
}),
)
}
} else {
quote! {
Self::replace(Self::load()?);
if Self::DYNAMIC_CONFIG_CACHE.is_some() {
if let ::core::result::Result::Ok(current) = Self::snapshot() {
::dynamic_config::__write_cache(¤t, Self::DYNAMIC_CONFIG_CACHE);
}
}
::core::result::Result::Ok(::core::option::Option::None)
}
}
}
pub(super) fn seed_recovered_previous(diff: bool) -> TokenStream {
if diff {
quote! {
*Self::dynamic_config_previous()
.lock()
.unwrap_or_else(::std::sync::PoisonError::into_inner) =
::core::option::Option::Some(snapshot);
}
} else {
quote! {
let _ = snapshot;
}
}
}