#[macro_export]
macro_rules! impl_figment_convert {
($name:ty) => {
impl<'a> From<&'a $name> for $crate::figment::Figment {
fn from(args: &'a $name) -> Self {
if let Some(root) = args.root.clone() {
$crate::Config::figment_with_root(root)
} else {
$crate::Config::figment_with_root($crate::find_project_root_path(None).unwrap())
}
.merge(args)
}
}
impl<'a> From<&'a $name> for $crate::Config {
fn from(args: &'a $name) -> Self {
let figment: $crate::figment::Figment = args.into();
$crate::Config::from_provider(figment).sanitized()
}
}
};
($name:ty, $start:ident $(, $more:ident)*) => {
impl<'a> From<&'a $name> for $crate::figment::Figment {
fn from(args: &'a $name) -> Self {
let mut figment: $crate::figment::Figment = From::from(&args.$start);
$ (
figment = figment.merge(&args.$more);
)*
figment
}
}
impl<'a> From<&'a $name> for $crate::Config {
fn from(args: &'a $name) -> Self {
let figment: $crate::figment::Figment = args.into();
$crate::Config::from_provider(figment).sanitized()
}
}
};
($name:ty, self, $start:ident $(, $more:ident)*) => {
impl<'a> From<&'a $name> for $crate::figment::Figment {
fn from(args: &'a $name) -> Self {
let mut figment: $crate::figment::Figment = From::from(&args.$start);
$ (
figment = figment.merge(&args.$more);
)*
figment = figment.merge(args);
figment
}
}
impl<'a> From<&'a $name> for $crate::Config {
fn from(args: &'a $name) -> Self {
let figment: $crate::figment::Figment = args.into();
$crate::Config::from_provider(figment).sanitized()
}
}
};
}
#[macro_export]
macro_rules! merge_impl_figment_convert {
($name:ty, $start:ident $(, $more:ident)*) => {
impl<'a> From<&'a $name> for $crate::figment::Figment {
fn from(args: &'a $name) -> Self {
let mut figment: $crate::figment::Figment = From::from(&args.$start);
$ (
figment = figment.merge(&args.$more);
)*
figment = figment.merge(args);
figment
}
}
impl<'a> From<&'a $name> for $crate::Config {
fn from(args: &'a $name) -> Self {
let figment: $crate::figment::Figment = args.into();
$crate::Config::from_provider(figment).sanitized()
}
}
};
}
#[macro_export]
macro_rules! impl_figment_convert_cast {
($name:ty) => {
impl<'a> From<&'a $name> for $crate::figment::Figment {
fn from(args: &'a $name) -> Self {
$crate::Config::figment_with_root($crate::find_project_root_path(None).unwrap())
.merge(args)
}
}
impl<'a> From<&'a $name> for $crate::Config {
fn from(args: &'a $name) -> Self {
let figment: $crate::figment::Figment = args.into();
$crate::Config::from_provider(figment).sanitized()
}
}
};
}
#[macro_export]
macro_rules! impl_figment_convert_basic {
($name:ty) => {
$crate::impl_figment_convert!($name);
impl $crate::figment::Provider for $name {
fn metadata(&self) -> $crate::figment::Metadata {
$crate::figment::Metadata::named(stringify!($name))
}
fn data(
&self,
) -> Result<
$crate::figment::value::Map<$crate::figment::Profile, $crate::figment::value::Dict>,
$crate::figment::Error,
> {
let mut dict = $crate::figment::value::Dict::new();
if let Some(root) = self.root.as_ref() {
dict.insert(
"root".to_string(),
$crate::figment::value::Value::serialize(root)?,
);
}
Ok($crate::figment::value::Map::from([($crate::Config::selected_profile(), dict)]))
}
}
};
}