setup basic app
This commit is contained in:
parent
2cb5dbd22c
commit
b37891af49
1111
Cargo.lock
generated
Normal file
1111
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
|
@ -9,3 +9,8 @@ description = "A Git mirroring daemon"
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
anyhow = "1.0.40"
|
||||||
|
log = "0.4.14"
|
||||||
|
rocket = "0.4.7"
|
||||||
|
rocket_contrib = { version = "0.4.7", features = [ "json" ] }
|
||||||
|
serde = { version = "1.0.125", features = [ "derive" ] }
|
||||||
|
|
2
Rocket.toml
Normal file
2
Rocket.toml
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
[global]
|
||||||
|
home = "./"
|
1
rust-toolchain
Normal file
1
rust-toolchain
Normal file
|
@ -0,0 +1 @@
|
||||||
|
nightly
|
13
src/gitea.rs
Normal file
13
src/gitea.rs
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
#[derive(Deserialize, Serialize)]
|
||||||
|
pub(crate) struct Repository {
|
||||||
|
pub(crate) name: String,
|
||||||
|
pub(crate) full_name: String,
|
||||||
|
pub(crate) clone_url: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Serialize)]
|
||||||
|
pub(crate) struct GiteaWebHook {
|
||||||
|
pub(crate) repository: Repository,
|
||||||
|
}
|
12
src/job.rs
Normal file
12
src/job.rs
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
pub struct Job {
|
||||||
|
repo: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Job {
|
||||||
|
pub fn new(repo: String) -> Self {
|
||||||
|
Self { repo }
|
||||||
|
}
|
||||||
|
pub fn run(&self) -> anyhow::Result<()> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
}
|
65
src/main.rs
65
src/main.rs
|
@ -1,3 +1,64 @@
|
||||||
fn main() {
|
#![feature(proc_macro_hygiene, decl_macro)]
|
||||||
println!("Hello, world!");
|
|
||||||
|
use std::path::{Path, PathBuf};
|
||||||
|
use std::sync::{
|
||||||
|
mpsc::{channel, Receiver, Sender},
|
||||||
|
Mutex,
|
||||||
|
};
|
||||||
|
use std::thread;
|
||||||
|
|
||||||
|
use rocket::{fairing::AdHoc, http::Status, post, routes, State};
|
||||||
|
use rocket_contrib::json::Json;
|
||||||
|
|
||||||
|
use log::error;
|
||||||
|
|
||||||
|
mod gitea;
|
||||||
|
use gitea::GiteaWebHook;
|
||||||
|
|
||||||
|
mod job;
|
||||||
|
use job::Job;
|
||||||
|
|
||||||
|
struct HomeDir(PathBuf);
|
||||||
|
struct JobSender(Mutex<Sender<Job>>);
|
||||||
|
|
||||||
|
#[post("/", data = "<payload>")]
|
||||||
|
fn gitea_webhook(payload: Json<GiteaWebHook>, sender: State<JobSender>) -> Status {
|
||||||
|
{
|
||||||
|
let sender = sender.0.lock().unwrap();
|
||||||
|
sender
|
||||||
|
.send(Job::new(payload.repository.full_name.clone()))
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
Status::Ok
|
||||||
|
}
|
||||||
|
|
||||||
|
fn repo_updater(rx: Receiver<Job>) {
|
||||||
|
loop {
|
||||||
|
let job = rx.recv().unwrap();
|
||||||
|
|
||||||
|
if let Err(err) = job.run() {
|
||||||
|
error!("couldn't process job: {}", err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let (sender, receiver) = channel();
|
||||||
|
|
||||||
|
thread::spawn(move || {
|
||||||
|
repo_updater(receiver);
|
||||||
|
});
|
||||||
|
|
||||||
|
rocket::ignite()
|
||||||
|
.mount("/", routes![gitea_webhook])
|
||||||
|
.manage(JobSender(Mutex::new(sender)))
|
||||||
|
.attach(AdHoc::on_attach("Assets Config", |rocket| {
|
||||||
|
let home_dir = rocket.config().get_str("home").unwrap();
|
||||||
|
|
||||||
|
let home_dir = Path::new(home_dir).into();
|
||||||
|
|
||||||
|
Ok(rocket.manage(HomeDir(home_dir)))
|
||||||
|
}))
|
||||||
|
.launch();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue