Skip to main content

trz_gateway_common/x509/
stack.rs

1use nameth::NamedEnumValues as _;
2use nameth::nameth;
3use openssl::error::ErrorStack;
4use openssl::stack::Stack;
5use openssl::stack::Stackable;
6
7/// Helper to convert a list of certificates into a certificate chain,
8/// represented as a [Stack].
9pub fn make_stack<T: Stackable>(
10    items: impl Iterator<Item = T>,
11) -> Result<Stack<T>, MakeStackError> {
12    let mut stack = Stack::new().map_err(MakeStackError::New)?;
13    for item in items {
14        stack.push(item).map_err(MakeStackError::Push)?;
15    }
16    Ok(stack)
17}
18
19#[nameth]
20#[derive(thiserror::Error, Debug)]
21pub enum MakeStackError {
22    #[error("[{n}] {0}", n = self.name())]
23    New(ErrorStack),
24
25    #[error("[{n}] {0}", n = self.name())]
26    Push(ErrorStack),
27}