use ferrin_spec::JsonValue;
use ferrin_spec::ProviderOptions;
use ferrin_spec::error::InvalidArgumentError;
use serde::de::DeserializeOwned;
pub fn parse_provider_options<T: DeserializeOwned>(
provider_key: &str,
options: &ProviderOptions,
) -> Result<Option<T>, InvalidArgumentError> {
let Some(raw) = options.get(provider_key) else {
return Ok(None);
};
serde_json::from_value::<T>(JsonValue::Object(raw.clone()))
.map(Some)
.map_err(|error| {
let mut invalid = InvalidArgumentError::new(
"provider_options",
format!("invalid {provider_key} provider options: {error}"),
);
invalid.cause = Some(Box::new(error));
invalid
})
}