Skip to content

Commit

Permalink
build cli for russenger
Browse files Browse the repository at this point in the history
  • Loading branch information
j03-dev committed Oct 17, 2023
1 parent be0593b commit 038deee
Show file tree
Hide file tree
Showing 4 changed files with 95 additions and 44 deletions.
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ path = "src/lib.rs"

[dependencies]
rocket = { version = "0.5.0-rc.3", features = ["json"] }
rocket_cors = { git = "https://github.com/lawliet89/rocket_cors", branch = "master" }
reqwest = { version = "0.11.18", features = ["json"] }
serde = { version = "1.0", features = ["derive"] }
dotenv = "0.15.0"
Expand Down
90 changes: 90 additions & 0 deletions src/cli.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
use std::env;
use std::str::FromStr;

use dotenv::dotenv;
use rocket::{catchers, routes};
use rocket_cors::{AllowedHeaders, AllowedMethods, AllowedOrigins, CorsOptions};

use crate::core::{page_not_found, server_panic, webhook_core, webhook_verify};
use crate::core::app_state::AppState;
use crate::models::User;

#[derive(Clone)]
struct Args {
option: String,
_value: String,
}

impl Args {
fn new(option: &str, value: &str) -> Self {
Self {
option: option.into(),
_value: value.into(),
}
}

pub fn get_option(&self) -> String {
self.option.clone()
}
}

fn args_parser() -> Option<Args> {
let args: Vec<String> = env::args().collect();
match args.len() {
3 => Some(Args::new(&args[1], &args[2])),
_ => None,
}
}

async fn run_server() {
dotenv().ok();
let allowed_origins = AllowedOrigins::all();
let allowed_methods: AllowedMethods = ["Get", "Post"]
.iter()
.map(|s| FromStr::from_str(s).unwrap())
.collect();

let cors = CorsOptions {
allowed_origins,
allowed_methods,
allowed_headers: AllowedHeaders::all(),
allow_credentials: true,
..Default::default()
}
.to_cors()
.unwrap();

rocket::build()
.attach(cors)
.manage(AppState::init().await)
.mount("/", routes![webhook_verify, webhook_core])
.register("/", catchers![page_not_found, server_panic])
.launch()
.await
.unwrap();
}

async fn migrate() {
dotenv().ok();
let status = User::new().await.migrate().await;
if status {
println!("Migrate Success");
} else {
println!("Migrate Failed");
}
}

fn help() {
println!("cargo run --release runserver or migrate")
}

pub async fn command() {
if let Some(args) = args_parser() {
let option = args.get_option();
match option.as_str() {
"runserver" => run_server().await,
"migrate" => migrate().await,
_ => help()
}
}
}
4 changes: 0 additions & 4 deletions src/core/app_state.rs
Original file line number Diff line number Diff line change
@@ -1,16 +1,12 @@
use crate::models::User;
use dotenv::dotenv;

pub struct AppState {
pub user_conn: User,
}

impl AppState {
pub async fn init() -> Self {
dotenv().ok(); //load dotenv
let user_conn: User = User::new().await;
let is_migrate = user_conn.migrate().await;
println!("migration {is_migrate}");
Self { user_conn }
}
}
44 changes: 4 additions & 40 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ pub mod core;
pub mod hooks;
pub mod models;
pub mod response_models;
pub mod cli;

#[macro_export]
macro_rules! register_action {
Expand All @@ -19,51 +20,14 @@ macro_rules! russenger_app {
#[macro_use]
extern crate rocket;

use std::str::FromStr;
use std::error::Error;

use rocket_cors::{AllowedHeaders, AllowedMethods, AllowedOrigins};

use russenger::cli::command;
use russenger::core::action::ACTION_REGISTRY;
use russenger::core::app_state::AppState;
use russenger::core::{
page_not_found,
server_panic,
webhook_core,
webhook_verify
};
use russenger::register_action;


#[rocket::main]
async fn main() -> Result<(), Box<dyn Error>> {

async fn main(){
$(register_action!($path, $action);)*

let allowed_origins = AllowedOrigins::all();
let allowed_methods: AllowedMethods = ["Get", "Post"]
.iter()
.map(|s| FromStr::from_str(s).unwrap())
.collect();

let cors = rocket_cors::CorsOptions {
allowed_origins,
allowed_methods,
allowed_headers: AllowedHeaders::all(),
allow_credentials: true,
..Default::default()
}
.to_cors()?;

rocket::build()
.attach(cors)
.manage(AppState::init().await)
.mount("/", routes![webhook_verify, webhook_core])
.register("/", catchers![page_not_found, server_panic])
.launch()
.await?;

Ok(())
command()
}
};
}

0 comments on commit 038deee

Please sign in to comment.