git-gemini-forge 0.4.0

A simple Gemini server that serves a read-only view of public repositories from a Git forge.
use strum::{IntoEnumIterator, ParseError};
use crate::network::ForgeApiKind;

/// The ways that retrieving config values might fail.
pub enum Error {
	/// Invalid value for env var `FORGE_TYPE`.
	BadPlatformType(strum::ParseError),

	/// The value provided for env var `FORGE_URL` is not a valid URL.
	BadUrl(url::ParseError),
}

fn fmt_error(err: &Error, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
	// Describe the various kinds of errors:
	match &err {
		Error::BadPlatformType(err) => {
			let options: Vec<ForgeApiKind> = ForgeApiKind::iter().collect();
			match err {
				ParseError::VariantNotFound => write!(f, "Platform type must be one of {:?}", options),
			}
		},
		Error::BadUrl(err) => write!(f, "Invalid source URL was given: {err}"),
	}
}

impl std::fmt::Debug for Error {
	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
		fmt_error(&self, f)
	}
}

impl core::fmt::Display for Error {
	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
		fmt_error(&self, f)
	}
}

impl std::error::Error for Error {}