use std::io;
use std::net::IpAddr;
use std::ops::Range;
use std::string::FromUtf8Error;
use thiserror::Error;
use tokio::runtime::TryCurrentError;
use tokio::sync::mpsc;
use tokio::task::JoinError;
use crate::server::ServerControl;
#[derive(Error, Debug)]
pub enum ConfigError {
#[error("Invalid server config (expected {expected}, found {found})")]
InvalidServerConfig { expected: String, found: String },
#[error("Cannot bind to {addr} on any port from {}-{}", port_range.start, port_range.end - 1)]
CannotBindAddress {
addr: IpAddr,
port_range: Range<u16>,
},
}
#[derive(Error, Debug)]
pub enum ServerError {
#[error("I/O error")]
IoError(#[from] io::Error),
#[error("Tokio must be running")]
AsyncRuntimeRequired(#[from] TryCurrentError),
#[error("Error signaling server")]
InternalCommError(#[from] mpsc::error::SendError<ServerControl>),
#[error("Internal server error")]
InternalServerError(#[from] JoinError),
#[error("Request error")]
RequestError(#[from] hyper::Error),
#[error("Encoding error")]
EncodingError(#[from] FromUtf8Error),
#[error("No authorization code received")]
NoResult,
}
#[derive(Error, Debug)]
pub enum AuthError {
#[error("Invalid CSRF token (state parameter)")]
CsrfMismatch,
#[error("No authorization code or PKCE verifier present")]
InvalidAuthState,
}