Merge branch '26-restructure-part-2' into develop

master^2
Jef Roosens 2021-04-16 18:52:58 +02:00
commit 5534df00dc
Signed by: Jef Roosens
GPG Key ID: 955C0660072F691F
15 changed files with 61 additions and 52 deletions

View File

@ -2,7 +2,7 @@
# This hook lints the code, and if we're on develop or master, also forces the tests to pass.
./fejctl lint &> /dev/null 2>&1 || {
>&2 echo "Format check failed, use 'make lint' for more information.";
>&2 echo "Format check failed, use './fejctl lint' for more information.";
exit 1;
}

View File

@ -6,7 +6,7 @@ edition = "2018"
[lib]
name = "fej"
src = "src/lib.rs"
path = "src/fej/lib.rs"
test = true
bench = true
doc = true
@ -14,10 +14,11 @@ doctest = true
[[bin]]
name = "server"
src = "src/bin/server/main.rs"
test = false
bench = false
doc = false
path = "src/server/main.rs"
test = true
bench = true
doc = true
doctest = true
[dependencies]
rocket = "0.4.7"

View File

@ -1,25 +1,17 @@
# Fej
Fej is an API written in Rust. I started this project to learn the language,
and really just have some fun.
Fej is a RESTful API that does lots of different things. It started as an
experiment to learn Rust, but has grown into a full-on passion project.
## Project Structure
The folder structure follows the structure of the URLs, e.g. the route for
`/hello/world` is found in the module `src/hello`.
The `src` folder contains subfolders for the various binaries and the main
library, called `fej`. The biggest binary is called `server`, which is the
binary that actually runs the Rocket.rs web server. All the others are utility
programs, mostly consisting of scrapers for various services.
Each module contains the following base files:
* `mod.rs`: defines the modules' content, and contains the route definitions.
The route functions themselves only contain the functionality needed to
represent the data, not acquire it.
* `controller.rs`: this file contains the actual logic of each route. If the
logic becomes too complicated to be contained inside a single file,
`controller.rs` becomes its own module folder named `controller`.
* `tests.rs`: this contains tests for the specific module. This can also be a
module directory if need be.
Every module has a `routes` function that returns its route macros.
Version 1.1 also introduces the use of a database, namely
[PostgreSQL 13](https://www.postgresql.org/).
## Roadmap
@ -27,19 +19,33 @@ See [roadmap.md](roadmap.md).
## Development
The entire toolchain runs on Alpine inside Docker. This makes building easier,
and (hopefully) eliminates any system-specific bugs.
To make development more consistent (and keep my computer a bit cleaner) I've
decided to run the entire toolchain using Docker, with Alpine Linux base
images. This also allows me to make really small final images. Technically,
Docker is the only dependency you need to contribute to this project
(not accounting for language servers etc.).
A [Makefile wrapper](Makefile) is provided for ease of use. Do check it out, as
all the commands are documented for your understanding ;)
A [Bash script](fejctl) is provided to speed up development on the various
binaries. It aids in starting up the containers, choosing which binary to run
etc. A quick rundown of its most important features:
There's also the `build` script. This script does all the "heavy" lifting. It
chooses which Dockerfile to build according to the given arguments, and
generates tags for the images (useful when pushing releases). The Makefile is
really just a wrapper around this build script, allowing you to write
`make test` instead of `./build -m dev -a run test`.
```bash
# By default, it compiles the 'server' binary (but doesn't run it)
./fejctl
tl;dr run `make run` to run your build, and `make test` to run the tests.
# The first argument is the action you wish to perform, the second on which
# binary (not all commands need a binary as input, so they just ignore it)
# For example, this will run the binary called server
./fejctl r server
# This runs the tests (all commands also have their full name if you want)
./fejctl t
./fejctl test
# These attach to the two containers
./fejctl sh # Opens a new root shell inside the 'fej' container
./fejctl psql # Open a new psql shell in the fej database
```
## Docker images

View File

@ -69,8 +69,8 @@ setting up a database for this version anyways.
## Kissanime
I like watching anime from time to time, and I've always used Kissanime for
this. However, their sites can be quite slow, and riddled with ads from time to
time. That's why I'd like to create a high-speed wrapper that extracts all the
needed info from their sites, removing the need for the user to ever actually
visit their site. The API can just act as a fast search index, complete with
indexing of the links to the videos and everything.
this. However, their sites can be quite slow, and riddled with ads. That's why
I'd like to create a high-speed wrapper that extracts all the needed info from
their sites, removing the need for the user to ever actually visit their site.
The API can just act as a fast search index, complete with indexing of the
links to the videos and everything.

View File

@ -10,6 +10,8 @@ pub enum FejError {
FailedRequest,
}
// I'd love to move this over to the server binary, but right now, error E0117 is making that
// imopssible
impl From<FejError> for Status {
fn from(err: FejError) -> Status {
match err {

View File

@ -1,11 +1,7 @@
#![feature(proc_macro_hygiene, decl_macro)]
#[macro_use]
extern crate rocket;
// Route modules
pub mod ivago;
// Helper modules
pub mod catchers;
pub mod errors;

View File

@ -1,7 +1,13 @@
#![feature(proc_macro_hygiene, decl_macro)]
#[macro_use]
extern crate rocket;
use fej::{catchers, ivago};
#[cfg(test)]
mod tests;
mod catchers;
mod routes;
// Very temporary solution for CORS
// https://stackoverflow.com/questions/62412361/how-to-set-up-cors-or-options-for-rocket-rs
@ -33,7 +39,7 @@ impl Fairing for CORS {
fn rocket() -> rocket::Rocket {
rocket::ignite()
.attach(CORS)
.mount("/ivago", ivago::routes())
.mount("/ivago", routes::ivago())
.register(catchers![catchers::not_found])
}

View File

@ -1,14 +1,7 @@
mod controller;
use controller::{get_pickup_times, search_streets};
use controller::{BasicDate, PickupTime, Street};
use fej::ivago::{get_pickup_times, search_streets, BasicDate, PickupTime, Street};
use rocket::http::Status;
use rocket_contrib::json::Json;
pub fn routes() -> Vec<rocket::Route> {
routes![route_search_streets, route_get_pickup_times]
}
/// This route handles the Ivago search endpoint. It returns a list of streets,
/// consisting of a street name & a city.
///

View File

@ -0,0 +1,5 @@
mod ivago;
pub fn ivago() -> Vec<rocket::Route> {
routes![ivago::route_search_streets, ivago::route_get_pickup_times]
}

View File

@ -3,7 +3,7 @@ use rocket::http::Status;
use rocket::local::Client;
fn rocket() -> rocket::Rocket {
rocket::ignite().mount("/", fej_lib::ivago::routes())
rocket::ignite().mount("/", super::routes::ivago())
}
/// Test 404 response