use serde::Serialize;
use serde_json::json;
use signature::Error as SignatureError;
use crate::key::BuildFromKey;
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub enum DeriveFromKey<Value> {
#[default]
Omit,
Derived,
Explicit(Value),
}
impl<Value> DeriveFromKey<Value> {
pub fn omit(&mut self) {
*self = Self::Omit;
}
pub fn derived(&mut self) {
*self = Self::Derived;
}
pub fn explicit(&mut self, value: Value) {
*self = Self::Explicit(value);
}
}
impl<Value> DeriveFromKey<Value>
where
Value: Serialize,
{
pub(super) fn parameter(
&self,
key: &str,
) -> Result<Option<serde_json::Value>, serde_json::Error> {
match self {
DeriveFromKey::Omit => Ok(None),
DeriveFromKey::Derived => Ok(Some(json!(format!("<{key}>")))),
DeriveFromKey::Explicit(value) => Ok(Some(serde_json::to_value(value)?)),
}
}
}
impl<Value> DeriveFromKey<Value> {
pub(super) fn render<K>(self, key: &K) -> Result<Option<Value>, SignatureError>
where
Value: BuildFromKey<K>,
K: ?Sized,
{
match self {
DeriveFromKey::Omit => Ok(None),
DeriveFromKey::Derived => Ok(Some(
Value::derive_from_key(key).map_err(SignatureError::from_source)?,
)),
DeriveFromKey::Explicit(value) => Ok(Some(value)),
}
}
}