Added docker building.
This commit is contained in:
		
							
								
								
									
										53
									
								
								src/main.rs
									
									
									
									
									
								
							
							
						
						
									
										53
									
								
								src/main.rs
									
									
									
									
									
								
							@ -1,8 +1,9 @@
 | 
			
		||||
use futures::{stream::FuturesUnordered, StreamExt};
 | 
			
		||||
use futures::{stream::FuturesUnordered, Future};
 | 
			
		||||
use std::sync::Arc;
 | 
			
		||||
use tokio::sync::RwLock;
 | 
			
		||||
 | 
			
		||||
use clap::Parser;
 | 
			
		||||
use futures::StreamExt;
 | 
			
		||||
use logging::setup_logger;
 | 
			
		||||
 | 
			
		||||
mod args;
 | 
			
		||||
@ -11,7 +12,12 @@ mod logging;
 | 
			
		||||
mod server;
 | 
			
		||||
pub mod utils;
 | 
			
		||||
 | 
			
		||||
#[tokio::main(flavor = "current_thread")]
 | 
			
		||||
async fn error_wrap<T>(fut: impl Future<Output = std::io::Result<T>>) -> anyhow::Result<T> {
 | 
			
		||||
    let res = fut.await?;
 | 
			
		||||
    Ok(res)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[tokio::main]
 | 
			
		||||
async fn main() -> anyhow::Result<()> {
 | 
			
		||||
    dotenvy::dotenv().ok();
 | 
			
		||||
    let args = args::Arguments::parse();
 | 
			
		||||
@ -22,29 +28,24 @@ async fn main() -> anyhow::Result<()> {
 | 
			
		||||
    let bot_token = token_lock.clone();
 | 
			
		||||
    let server_token = token_lock.clone();
 | 
			
		||||
 | 
			
		||||
    let local_set = tokio::task::LocalSet::new();
 | 
			
		||||
    local_set
 | 
			
		||||
        .run_until(async {
 | 
			
		||||
            let tasks = vec![
 | 
			
		||||
                tokio::task::spawn_local(bot::start(args.bot.clone(), bot_token)),
 | 
			
		||||
                tokio::task::spawn_local(server::start(args.server.clone(), server_token)),
 | 
			
		||||
            ];
 | 
			
		||||
            // Here we wait for one async task to complete.
 | 
			
		||||
            let completed = tasks
 | 
			
		||||
                .into_iter()
 | 
			
		||||
                .collect::<FuturesUnordered<_>>()
 | 
			
		||||
                .take(1)
 | 
			
		||||
                .collect::<Vec<_>>()
 | 
			
		||||
                .await;
 | 
			
		||||
            // Now we get all completed futures (one future),
 | 
			
		||||
            // and return it's result.
 | 
			
		||||
            if let Some(fut) = completed.into_iter().next() {
 | 
			
		||||
                fut?
 | 
			
		||||
            } else {
 | 
			
		||||
                Ok(())
 | 
			
		||||
            }
 | 
			
		||||
        })
 | 
			
		||||
        .await?;
 | 
			
		||||
    let web_server = server::create(args.server.clone(), server_token)?;
 | 
			
		||||
    let bot_future = bot::start(args.bot.clone(), bot_token);
 | 
			
		||||
 | 
			
		||||
    Ok(())
 | 
			
		||||
    let tasks = [
 | 
			
		||||
        tokio::task::spawn(bot_future),
 | 
			
		||||
        tokio::task::spawn(error_wrap(web_server)),
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    let completed = tasks
 | 
			
		||||
        .into_iter()
 | 
			
		||||
        .collect::<FuturesUnordered<_>>()
 | 
			
		||||
        .take(1)
 | 
			
		||||
        .collect::<Vec<_>>()
 | 
			
		||||
        .await;
 | 
			
		||||
 | 
			
		||||
    if let Some(fut) = completed.into_iter().next() {
 | 
			
		||||
        fut?
 | 
			
		||||
    } else {
 | 
			
		||||
        Ok(())
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,15 +1,15 @@
 | 
			
		||||
use std::sync::Arc;
 | 
			
		||||
use tokio::sync::RwLock;
 | 
			
		||||
 | 
			
		||||
use actix_web::{web::Data, App, HttpServer};
 | 
			
		||||
use actix_web::{dev::Server, web::Data, App, HttpServer};
 | 
			
		||||
 | 
			
		||||
use crate::args::ServerConfig;
 | 
			
		||||
 | 
			
		||||
use super::routes::{healthcheck, index, login};
 | 
			
		||||
 | 
			
		||||
pub async fn start(args: ServerConfig, token: Arc<RwLock<Option<String>>>) -> anyhow::Result<()> {
 | 
			
		||||
pub fn create(args: ServerConfig, token: Arc<RwLock<Option<String>>>) -> anyhow::Result<Server> {
 | 
			
		||||
    let addr = (args.host.clone(), args.port);
 | 
			
		||||
    HttpServer::new(move || {
 | 
			
		||||
    let server = HttpServer::new(move || {
 | 
			
		||||
        App::new()
 | 
			
		||||
            .wrap(actix_web::middleware::Logger::new(
 | 
			
		||||
                "\"%r\" \"-\" \"%s\" \"%a\" \"%D\"",
 | 
			
		||||
@ -23,7 +23,6 @@ pub async fn start(args: ServerConfig, token: Arc<RwLock<Option<String>>>) -> an
 | 
			
		||||
    })
 | 
			
		||||
    .bind(addr)?
 | 
			
		||||
    .workers(1)
 | 
			
		||||
    .run()
 | 
			
		||||
    .await?;
 | 
			
		||||
    Ok(())
 | 
			
		||||
    .run();
 | 
			
		||||
    Ok(server)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -3,4 +3,4 @@ mod routes;
 | 
			
		||||
mod schema;
 | 
			
		||||
mod templates;
 | 
			
		||||
 | 
			
		||||
pub use main::start;
 | 
			
		||||
pub use main::create;
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user