Skip to main content

vss_client_ng/headers/
mod.rs

1use async_trait::async_trait;
2use std::collections::HashMap;
3use std::error::Error;
4use std::fmt::Display;
5use std::fmt::Formatter;
6
7#[cfg(feature = "lnurl-auth")]
8mod lnurl_auth_jwt;
9
10#[cfg(feature = "lnurl-auth")]
11pub use lnurl_auth_jwt::LnurlAuthToJwtProvider;
12
13#[cfg(feature = "sigs-auth")]
14pub mod sigs_auth;
15
16/// Defines a trait around how headers are provided for each VSS request.
17#[async_trait]
18pub trait VssHeaderProvider: Send + Sync {
19	/// Returns the HTTP headers to be used for a VSS request.
20	/// This method is called on each request, and should likely perform some form of caching.
21	///
22	/// A reference to the serialized request body is given as `request`.
23	/// It can be used to perform operations such as request signing.
24	async fn get_headers(
25		&self, request: &[u8],
26	) -> Result<HashMap<String, String>, VssHeaderProviderError>;
27}
28
29/// Errors around providing headers for each VSS request.
30#[derive(Debug)]
31pub enum VssHeaderProviderError {
32	/// Invalid data was encountered.
33	InvalidData {
34		/// The error message.
35		error: String,
36	},
37	/// An external request failed.
38	RequestError {
39		/// The error message.
40		error: String,
41	},
42	/// Authorization was refused.
43	AuthorizationError {
44		/// The error message.
45		error: String,
46	},
47	/// An application-level error occurred specific to the header provider functionality.
48	InternalError {
49		/// The error message.
50		error: String,
51	},
52}
53
54impl Display for VssHeaderProviderError {
55	fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
56		match self {
57			Self::InvalidData { error } => {
58				write!(f, "invalid data: {}", error)
59			},
60			Self::RequestError { error } => {
61				write!(f, "error performing external request: {}", error)
62			},
63			Self::AuthorizationError { error } => {
64				write!(f, "authorization was refused: {}", error)
65			},
66			Self::InternalError { error } => {
67				write!(f, "internal error: {}", error)
68			},
69		}
70	}
71}
72
73impl Error for VssHeaderProviderError {}
74
75/// A header provider returning an given, fixed set of headers.
76pub struct FixedHeaders {
77	headers: HashMap<String, String>,
78}
79
80impl FixedHeaders {
81	/// Creates a new header provider returning the given, fixed set of headers.
82	pub fn new(headers: HashMap<String, String>) -> FixedHeaders {
83		FixedHeaders { headers }
84	}
85}
86
87#[async_trait]
88impl VssHeaderProvider for FixedHeaders {
89	async fn get_headers(
90		&self, _request: &[u8],
91	) -> Result<HashMap<String, String>, VssHeaderProviderError> {
92		Ok(self.headers.clone())
93	}
94}