rum_framework 0.0.1

A toy web framework inspired by gin-gonic and express-js.
Documentation
use crate::context::RumContext;
use crate::handler::Handler;
use crate::method::MethodType;
use crate::thread::ThreadPool;
use std::net::TcpListener;
use std::sync::Arc;
use std::thread::available_parallelism;

pub struct RumServer {
    host: String,
    port: i32,
    handler: Handler,
}

impl RumServer {
    pub fn new(host: &str, port: i32) -> RumServer {
        return RumServer {
            host: host.to_string(),
            port: port,
            handler: Handler::new()
        };
    }

    pub fn use_html_template(&mut self, templates_path: &str) {
        self.handler.set_template_engine(templates_path);
    }

    pub fn use_static_assets(&mut self, static_asset_path: &str) {
        self.handler.set_static_assets(static_asset_path);
    }

    pub fn start(self) {
        let addr = format!("{}:{}", self.host, self.port);
        let listener = TcpListener::bind(addr).unwrap();
        println!("**RUM-FRAMEWORK** Listening: {}:{}", self.host, self.port);
        let available_parallelism_size = available_parallelism().unwrap().get();
        let pool_size = if available_parallelism_size < 4 {
            4
        } else {
            available_parallelism_size
        };
        let pool = ThreadPool::new(pool_size);
        let handler = Arc::new(self.handler);
        handler.router.show_routes("");
        for stream in listener.incoming() {
            let stream = stream.unwrap();
            let handler = Arc::clone(&handler);
            pool.execute(move || {
                handler.handle_connection(stream);
            });
        }
    }

    fn add_route(&mut self, method_type: MethodType, route: &str, handler: fn(&mut RumContext)) {
        self.handler.add_route(method_type, route, handler);
    }

    pub fn global_middleware(&mut self, handlers: Vec<fn(&mut RumContext)>){
        self.handler.set_middleware("", handlers);
    }

    pub fn middleware(&mut self, route: &str, handlers: Vec<fn(&mut RumContext)>){
        self.handler.set_middleware(route, handlers);
    }

    pub fn get(&mut self, route: &str, handler: fn(&mut RumContext)) {
        self.add_route(MethodType::GET, route, handler);
    }

    pub fn post(&mut self, route: &str, handler: fn(&mut RumContext)) {
        self.add_route(MethodType::POST, route, handler);
    }

    pub fn put(&mut self, route: &str, handler: fn(&mut RumContext)) {
        self.add_route(MethodType::PUT, route, handler);
    }

    pub fn delete(&mut self, route: &str, handler: fn(&mut RumContext)) {
        self.add_route(MethodType::DELETE, route, handler);
    }

    pub fn connect(&mut self, route: &str, handler: fn(&mut RumContext)) {
        self.add_route(MethodType::CONNECT, route, handler);
    }

    pub fn options(&mut self, route: &str, handler: fn(&mut RumContext)) {
        self.add_route(MethodType::OPTIONS, route, handler);
    }

    pub fn trace(&mut self, route: &str, handler: fn(&mut RumContext)) {
        self.add_route(MethodType::TRACE, route, handler);
    }

    pub fn patch(&mut self, route: &str, handler: fn(&mut RumContext)) {
        self.add_route(MethodType::PATCH, route, handler);
    }
}