use rskit_errors::{AppError, AppResult};
use serde::de::DeserializeOwned;
pub(crate) fn decode_typed<T>(
raw: config::Config,
apply_defaults: impl FnOnce(&mut T),
) -> AppResult<T>
where
T: DeserializeOwned,
{
let mut cfg: T = raw
.try_deserialize()
.map_err(|e| AppError::invalid_input("config", e.to_string()))?;
apply_defaults(&mut cfg);
Ok(cfg)
}
#[cfg(feature = "validate")]
pub(crate) fn decode_validated<T>(
raw: config::Config,
apply_defaults: impl FnOnce(&mut T),
) -> AppResult<T>
where
T: DeserializeOwned + rskit_validation::Validate,
{
let cfg = decode_typed(raw, apply_defaults)?;
cfg.validate()
.map_err(|e| AppError::invalid_input("config", e.to_string()))?;
Ok(cfg)
}