Skip to content

Commit 3e1f31c

Browse files
committed
fix: refactorings
2 parents 2100b62 + f9e4f91 commit 3e1f31c

File tree

12 files changed

+98
-162
lines changed

12 files changed

+98
-162
lines changed

Cargo.lock

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ futures-util = "0.3"
2626
rustls = "0.18"
2727
tokio-rustls = "0.14"
2828
toml = "0.5"
29+
anyhow = "1.0"
2930

3031
[features]
3132
default = ["postgres"]

src/acme.rs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use sqlx::{Pool, Postgres};
44
use tokio::runtime::Handle;
55
use tokio::stream::StreamExt;
66

7-
use crate::util::to_i64;
7+
use crate::util::{error, to_i64};
88

99
#[derive(Clone)]
1010
pub struct DatabasePersist {
@@ -41,11 +41,7 @@ impl Persist for DatabasePersist {
4141
.bind(value)
4242
.execute(&self.pool);
4343

44-
self.handle
45-
.block_on(query)
46-
.map_err(|err| acme_lib::Error::from(err.to_string()))?;
47-
48-
Ok(())
44+
self.handle.block_on(query).map(|_| ()).map_err(error)
4945
}
5046

5147
fn get<'a>(&self, key: &PersistKey<'a>) -> acme_lib::Result<Option<Vec<u8>>> {
@@ -59,10 +55,9 @@ impl Persist for DatabasePersist {
5955
.fetch(&self.pool);
6056

6157
match self.handle.block_on(rows.try_next()) {
62-
Ok(Some(row)) => row.try_get("value"),
63-
Ok(None) => return Ok(None),
64-
Err(e) => return Err(acme_lib::Error::from(e.to_string())),
58+
Ok(Some(row)) => row.try_get("value").map_err(error),
59+
Ok(None) => Ok(None),
60+
Err(e) => Err(error(e)),
6561
}
66-
.map_err(|err| acme_lib::Error::from(err.to_string()))
6762
}
6863
}

src/api.rs

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use anyhow::{anyhow, Error, Result};
12
use futures_util::future::OptionFuture;
23
use futures_util::stream::TryStream;
34
use futures_util::FutureExt;
@@ -7,7 +8,6 @@ use rustls::internal::pemfile::{certs, pkcs8_private_keys};
78
use rustls::{NoClientAuth, ServerConfig};
89
use sqlx::PgPool;
910
use std::io::Cursor;
10-
use std::io::ErrorKind;
1111
use std::ops::Deref;
1212
use std::sync::Arc;
1313
use tokio::io::{AsyncRead, AsyncWrite};
@@ -17,7 +17,6 @@ use warp::{http::Response, reply, serve, Filter, Rejection, Reply};
1717

1818
use crate::cert::{Cert, CertFacade};
1919
use crate::domain::{Domain, DomainFacade};
20-
use crate::util::Error;
2120

2221
struct Acceptor {
2322
pool: PgPool,
@@ -34,35 +33,30 @@ impl Acceptor {
3433
}
3534
}
3635

37-
fn create_server_config(
38-
db_cert: &mut Cert,
39-
) -> Result<Arc<ServerConfig>, Error<std::io::Error>> {
36+
fn create_server_config(db_cert: &mut Cert) -> Result<Arc<ServerConfig>> {
4037
let (private, cert) = match (&mut db_cert.private, &mut db_cert.cert) {
4138
(Some(ref mut private), Some(ref mut cert)) => (private, cert),
42-
_ => return Err(Error::from("Cert has no Cert or Private")),
39+
_ => return Err(anyhow!("Cert has no Cert or Private")),
4340
};
4441

4542
let mut private = Cursor::new(private);
4643
let mut privates = pkcs8_private_keys(&mut private)
47-
.map_err(|_| Error::msg(ErrorKind::InvalidInput, "Private is invalid"))?;
44+
.map_err(|_| anyhow!("Private is invalid {:?}", private))?;
4845
let private = privates
4946
.pop()
50-
.ok_or_else(|| Error::from("Private Vec is empty"))?;
47+
.ok_or_else(|| anyhow!("Private Vec is empty {:?}", privates))?;
5148

5249
let mut cert = Cursor::new(cert);
53-
let cert =
54-
certs(&mut cert).map_err(|_| Error::msg(ErrorKind::InvalidInput, "Cert is invalid"))?;
50+
let cert = certs(&mut cert).map_err(|_| anyhow!("Cert is invalid {:?}", cert))?;
5551

5652
let mut config = ServerConfig::new(NoClientAuth::new());
57-
config
58-
.set_single_cert(cert, private)
59-
.map_err(|_| Error::from("Couldn't configure Config with Cert and Private"))?;
53+
config.set_single_cert(cert, private)?;
6054
config.set_protocols(&["h2".into(), "http/1.1".into()]);
6155

6256
Ok(Arc::new(config))
6357
}
6458

65-
async fn load_cert(&self) -> Result<TlsAcceptor, Box<dyn std::error::Error + Send + Sync>> {
59+
async fn load_cert(&self) -> Result<TlsAcceptor> {
6660
let new_cert = CertFacade::first_cert(&self.pool).await?;
6761

6862
// could probably be improved
@@ -83,10 +77,8 @@ impl Acceptor {
8377
fn stream(
8478
listener: TcpListener,
8579
pool: PgPool,
86-
) -> impl TryStream<
87-
Ok = impl AsyncRead + AsyncWrite + Send + Unpin + 'static,
88-
Error = Box<dyn std::error::Error + Send + Sync>,
89-
> + Send {
80+
) -> impl TryStream<Ok = impl AsyncRead + AsyncWrite + Send + Unpin + 'static, Error = Error> + Send
81+
{
9082
let acceptor = Acceptor::new(pool);
9183
let acceptor_stream =
9284
futures_util::stream::unfold(acceptor, |acc| async { Some((acc.load_cert().await, acc)) });
@@ -130,7 +122,7 @@ impl Api {
130122
http: Option<A>,
131123
https: Option<A>,
132124
pool: PgPool,
133-
) -> tokio::io::Result<Self> {
125+
) -> Result<Self> {
134126
let http = OptionFuture::from(http.map(TcpListener::bind)).map(Option::transpose);
135127
let https = OptionFuture::from(https.map(TcpListener::bind)).map(Option::transpose);
136128

@@ -139,7 +131,7 @@ impl Api {
139131
Ok(Api { http, https, pool })
140132
}
141133

142-
pub async fn spawn(self) -> Result<(), Box<dyn std::error::Error>> {
134+
pub async fn spawn(self) -> Result<()> {
143135
let pool = self.pool.clone();
144136
let routes = warp::path("register")
145137
.and(warp::post())

src/cert.rs

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use acme_lib::{create_p384_key, Directory, DirectoryUrl};
2+
use anyhow::{anyhow, Context, Result};
23
use sqlx::{Executor, FromRow, PgPool, Postgres};
3-
use std::error::Error;
4-
use std::io::ErrorKind;
54
use std::time::Duration;
65
use tokio::time::Interval;
76
use uuid::Uuid;
@@ -93,7 +92,7 @@ impl CertFacade {
9392
Ok(())
9493
}
9594

96-
pub async fn start(pool: &PgPool) -> Result<Option<Cert>, sqlx::Error> {
95+
pub async fn start(pool: &PgPool) -> Result<Option<Cert>> {
9796
let mut transaction = pool.begin().await?;
9897

9998
let cert = CertFacade::first_cert(&mut transaction).await?;
@@ -155,11 +154,7 @@ pub struct CertManager {
155154
}
156155

157156
impl CertManager {
158-
pub async fn new(
159-
pool: PgPool,
160-
persist: DatabasePersist,
161-
acme: String,
162-
) -> Result<Self, Box<dyn Error>> {
157+
pub async fn new(pool: PgPool, persist: DatabasePersist, acme: String) -> Result<Self> {
163158
let directory = tokio::task::spawn_blocking(move || {
164159
Directory::from_url(persist, DirectoryUrl::Other(&acme))
165160
})
@@ -173,19 +168,8 @@ impl CertManager {
173168
// use constant
174169
tokio::time::interval(Duration::from_secs(3600))
175170
}
176-
}
177-
178-
fn error(kind: ErrorKind, message: &str) -> std::io::Error {
179-
let error: Box<dyn Error + Send + Sync> = From::from(message.to_string());
180-
std::io::Error::new(kind, error)
181-
}
182-
183-
fn other_error(message: &str) -> std::io::Error {
184-
error(ErrorKind::Other, message)
185-
}
186171

187-
impl CertManager {
188-
pub async fn spawn(self) -> Result<(), Box<dyn Error>> {
172+
pub async fn spawn(self) -> Result<()> {
189173
tokio::spawn(async move {
190174
let mut interval = CertManager::interval();
191175
loop {
@@ -205,10 +189,12 @@ impl CertManager {
205189
Ok(())
206190
}
207191

208-
async fn test(&self) -> Result<(), Box<dyn Error>> {
192+
async fn test(&self) -> Result<()> {
193+
// maybe context is not needed here
209194
let mut memory_cert = CertFacade::start(&self.pool)
210-
.await?
211-
.ok_or_else(|| other_error("Cert not found"))?;
195+
.await
196+
.context("Start failed")?
197+
.ok_or_else(|| anyhow!("Start did not return cert"))?;
212198

213199
// todo: improve
214200
let mut domain = DomainFacade::find_by_id(&self.pool, &memory_cert.domain)
@@ -225,7 +211,7 @@ impl CertManager {
225211
let mut auths = order.authorizations()?;
226212
let call = auths
227213
.pop()
228-
.ok_or_else(|| other_error("couldn't unpack auths"))?
214+
.ok_or_else(|| anyhow!("couldn't unpack auths"))?
229215
.dns_challenge();
230216
let proof = call.dns_proof();
231217

src/config.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
use anyhow::Result;
12
use serde::Deserialize;
23
use std::collections::HashMap;
3-
use std::error::Error;
44
use std::fs::File;
55
use std::io::Read;
66

@@ -34,7 +34,7 @@ pub struct Config {
3434
const DEFAULT_CONFIG_PATH: &str = "config.toml";
3535

3636
// is not async so we can use it to load settings for tokio runtime
37-
pub fn config(config_path: Option<String>) -> Result<Config, Box<dyn Error>> {
37+
pub fn config(config_path: Option<String>) -> Result<Config> {
3838
let config_path = config_path.as_deref().unwrap_or(DEFAULT_CONFIG_PATH);
3939
let mut file = File::open(config_path)?;
4040
let mut bytes = vec![];

0 commit comments

Comments
 (0)