murgamu 0.7.3

Murgamü is an NestJS-inspired web framework for Rust
Documentation
use crate::core::error::MurError;
use crate::mur_http::request::MurRequestContext;
use crate::traits::{MurController, MurService};
use http_body_util::Full;
use hyper::body::{Bytes, Incoming};
use hyper::{Request, Response};
use std::collections::HashMap;
use std::future::Future;
use std::pin::Pin;
use std::sync::Arc;

pub type MurMainResult = Result<(), Box<dyn std::error::Error + Send + Sync>>;
pub type MurRes = Result<Response<Full<Bytes>>, MurError>;
pub type MurResInfallible = Result<Response<Full<Bytes>>, std::convert::Infallible>;
pub type MurFuture = Pin<Box<dyn Future<Output = MurRes> + Send>>;
pub type MurRequest = Request<Incoming>;
pub type MurResponse = Response<Full<Bytes>>;
pub type MurRouteHandler = Arc<dyn Fn(MurRequestContext) -> MurFuture + Send + Sync>;
pub type MurPathParams = HashMap<String, String>;
pub type MurQueryParams = HashMap<String, String>;
pub type MurControllers = Vec<Arc<dyn MurController>>;

pub trait IntoController {
	fn into_controller(self) -> Arc<dyn MurController>;
}

impl<T: MurController + 'static> IntoController for T {
	fn into_controller(self) -> Arc<dyn MurController> {
		Arc::new(self)
	}
}

impl IntoController for Arc<dyn MurController> {
	fn into_controller(self) -> Arc<dyn MurController> {
		self
	}
}

pub fn controllers<I, C>(items: I) -> MurControllers
where
	I: IntoIterator<Item = C>,
	C: IntoController,
{
	items.into_iter().map(|c| c.into_controller()).collect()
}

pub type MurServices = Vec<(std::any::TypeId, Arc<dyn MurService>)>;

#[macro_export]
macro_rules! mur_controllers {
	() => {
		Vec::new()
	};
	($($controller:expr),+ $(,)?) => {
		vec![$(Box::new($controller) as Box<dyn $crate::traits::controller::MurController>),+]
	};
}

#[macro_export]
macro_rules! mur_services {
	() => {
		Vec::new()
	};
	($($service:expr),+ $(,)?) => {
		vec![$(
			(
				std::any::TypeId::of::<std::sync::Arc<_>>(),
				$service as std::sync::Arc<dyn $crate::traits::MurService>
			)
		),+]
	};
}

#[macro_export]
macro_rules! mur_service {
	($service:expr) => {{
		let svc = $service.clone();
		(
			std::any::TypeId::of::<std::sync::Arc<_>>(),
			svc as std::sync::Arc<dyn $crate::traits::MurService>,
		)
	}};
}

#[derive(Debug, Clone)]
pub struct MurRouteInfo {
	pub method: String,
	pub path: String,
	pub controller: String,
	pub handler: String,
}