#[derive(Debug, Clone)]
pub struct ServiceHeaders {
pub partner_id: String,
pub channel_id: String,
pub external_id: String,
pub timestamp: String,
pub signature: String,
pub bearer_token: String,
}
impl ServiceHeaders {
pub fn builder() -> ServiceHeadersBuilder {
ServiceHeadersBuilder::default()
}
pub fn into_pairs(self) -> Vec<(&'static str, String)> {
vec![
("X-PARTNER-ID", self.partner_id),
("CHANNEL-ID", self.channel_id),
("X-EXTERNAL-ID", self.external_id),
("X-TIMESTAMP", self.timestamp),
("X-SIGNATURE", self.signature),
("Authorization", format!("Bearer {}", self.bearer_token)),
]
}
}
#[derive(Debug, Clone, Default)]
pub struct ServiceHeadersBuilder {
partner_id: Option<String>,
channel_id: Option<String>,
external_id: Option<String>,
timestamp: Option<String>,
signature: Option<String>,
bearer_token: Option<String>,
}
impl ServiceHeadersBuilder {
pub fn partner_id(mut self, v: impl Into<String>) -> Self {
self.partner_id = Some(v.into());
self
}
pub fn channel_id(mut self, v: impl Into<String>) -> Self {
self.channel_id = Some(v.into());
self
}
pub fn external_id(mut self, v: impl Into<String>) -> Self {
self.external_id = Some(v.into());
self
}
pub fn timestamp(mut self, v: impl Into<String>) -> Self {
self.timestamp = Some(v.into());
self
}
pub fn signature(mut self, v: impl Into<String>) -> Self {
self.signature = Some(v.into());
self
}
pub fn bearer_token(mut self, v: impl Into<String>) -> Self {
self.bearer_token = Some(v.into());
self
}
pub fn build(self) -> crate::Result<ServiceHeaders> {
let mut missing = Vec::new();
macro_rules! take {
($field:ident) => {{
match self.$field {
Some(v) => v,
None => {
missing.push(stringify!($field));
String::new()
}
}
}};
}
let h = ServiceHeaders {
partner_id: take!(partner_id),
channel_id: take!(channel_id),
external_id: take!(external_id),
timestamp: take!(timestamp),
signature: take!(signature),
bearer_token: take!(bearer_token),
};
if !missing.is_empty() {
return Err(crate::Error::SnapBi(format!(
"ServiceHeadersBuilder missing fields: {}",
missing.join(", ")
)));
}
Ok(h)
}
}
#[derive(Debug, Clone)]
pub struct OAuthHeaders {
pub client_key: String,
pub timestamp: String,
pub signature: String,
}
impl OAuthHeaders {
pub fn into_pairs(self) -> Vec<(&'static str, String)> {
vec![
("X-CLIENT-KEY", self.client_key),
("X-TIMESTAMP", self.timestamp),
("X-SIGNATURE", self.signature),
]
}
}