code: usage example project
This commit is contained in:
parent
ffe9824203
commit
f19899fa82
6
examples/usage_example/.cargo/config.toml
Normal file
6
examples/usage_example/.cargo/config.toml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
[alias]
|
||||||
|
loco = "run --"
|
||||||
|
loco-tool = "run --bin tool --"
|
||||||
|
|
||||||
|
|
||||||
|
playground = "run --example playground"
|
19
examples/usage_example/.gitignore
vendored
Normal file
19
examples/usage_example/.gitignore
vendored
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
**/config/local.yaml
|
||||||
|
**/config/*.local.yaml
|
||||||
|
**/config/production.yaml
|
||||||
|
|
||||||
|
# Generated by Cargo
|
||||||
|
# will have compiled files and executables
|
||||||
|
debug/
|
||||||
|
target/
|
||||||
|
|
||||||
|
# include cargo lock
|
||||||
|
!Cargo.lock
|
||||||
|
|
||||||
|
# These are backup files generated by rustfmt
|
||||||
|
**/*.rs.bk
|
||||||
|
|
||||||
|
# MSVC Windows builds of rustc generate these, which store debugging information
|
||||||
|
*.pdb
|
||||||
|
|
||||||
|
*.sqlite
|
2
examples/usage_example/.rustfmt.toml
Normal file
2
examples/usage_example/.rustfmt.toml
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
max_width = 100
|
||||||
|
use_small_heuristics = "Default"
|
4268
examples/usage_example/Cargo.lock
generated
Normal file
4268
examples/usage_example/Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
44
examples/usage_example/Cargo.toml
Normal file
44
examples/usage_example/Cargo.toml
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
[workspace]
|
||||||
|
|
||||||
|
[package]
|
||||||
|
name = "usage_example"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
publish = false
|
||||||
|
default-run = "usage_example-cli"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[workspace.dependencies]
|
||||||
|
loco-rs = { version = "0.14.0", default-features = false }
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
loco-minijinja-engine = { path = "../../", version = "*", features = [
|
||||||
|
"autoreloader",
|
||||||
|
] }
|
||||||
|
loco-rs = { workspace = true, features = ["cli"] }
|
||||||
|
serde = { version = "1", features = ["derive"] }
|
||||||
|
serde_json = { version = "1" }
|
||||||
|
tokio = { version = "1.33.0", default-features = false, features = [
|
||||||
|
"rt-multi-thread",
|
||||||
|
] }
|
||||||
|
async-trait = { version = "0.1.74" }
|
||||||
|
axum = { version = "0.8.1" }
|
||||||
|
tracing = { version = "0.1.40" }
|
||||||
|
tracing-subscriber = { version = "0.3.17", features = ["env-filter", "json"] }
|
||||||
|
regex = { version = "1.11.1" }
|
||||||
|
|
||||||
|
[[bin]]
|
||||||
|
name = "usage_example-cli"
|
||||||
|
path = "src/bin/main.rs"
|
||||||
|
required-features = []
|
||||||
|
[[bin]]
|
||||||
|
name = "tool"
|
||||||
|
path = "src/bin/tool.rs"
|
||||||
|
required-features = []
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
loco-rs = { workspace = true, features = ["testing"] }
|
||||||
|
serial_test = { version = "3.1.1" }
|
||||||
|
rstest = { version = "0.21.0" }
|
||||||
|
insta = { version = "1.34.0", features = ["redactions", "yaml", "filters"] }
|
56
examples/usage_example/README.md
Normal file
56
examples/usage_example/README.md
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
# Welcome to Loco :train:
|
||||||
|
|
||||||
|
[Loco](https://loco.rs) is a web and API framework running on Rust.
|
||||||
|
|
||||||
|
This is the **Minijinja Template Example** which includes no real functionality.
|
||||||
|
It should demonstrate and test the usage of the Minijinja Template Engine for Loco.
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cargo loco start
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
$ cargo loco start
|
||||||
|
Finished dev [unoptimized + debuginfo] target(s) in 21.63s
|
||||||
|
Running `target/debug/myapp start`
|
||||||
|
|
||||||
|
:
|
||||||
|
:
|
||||||
|
:
|
||||||
|
|
||||||
|
controller/app_routes.rs:203: [Middleware] Adding log trace id
|
||||||
|
|
||||||
|
▄ ▀
|
||||||
|
▀ ▄
|
||||||
|
▄ ▀ ▄ ▄ ▄▀
|
||||||
|
▄ ▀▄▄
|
||||||
|
▄ ▀ ▀ ▀▄▀█▄
|
||||||
|
▀█▄
|
||||||
|
▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄ ▀▀█
|
||||||
|
██████ █████ ███ █████ ███ █████ ███ ▀█
|
||||||
|
██████ █████ ███ █████ ▀▀▀ █████ ███ ▄█▄
|
||||||
|
██████ █████ ███ █████ █████ ███ ████▄
|
||||||
|
██████ █████ ███ █████ ▄▄▄ █████ ███ █████
|
||||||
|
██████ █████ ███ ████ ███ █████ ███ ████▀
|
||||||
|
▀▀▀██▄ ▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀ ██▀
|
||||||
|
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
|
||||||
|
https://loco.rs
|
||||||
|
|
||||||
|
environment: development
|
||||||
|
database: automigrate
|
||||||
|
logger: debug
|
||||||
|
compilation: debug
|
||||||
|
modes: server
|
||||||
|
|
||||||
|
listening on http://localhost:5150
|
||||||
|
```
|
||||||
|
|
||||||
|
## Full Stack Serving
|
||||||
|
|
||||||
|
You can check your [configuration](config/development.yaml) to pick either frontend setup or server-side rendered template, and activate the relevant configuration sections.
|
||||||
|
|
||||||
|
## Getting help
|
||||||
|
|
||||||
|
Check out [a quick tour](https://loco.rs/docs/getting-started/tour/) or [the complete guide](https://loco.rs/docs/getting-started/guide/).
|
33
examples/usage_example/config/development.yaml
Normal file
33
examples/usage_example/config/development.yaml
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
# Loco configuration file documentation
|
||||||
|
|
||||||
|
# Application logging configuration
|
||||||
|
logger:
|
||||||
|
# Enable or disable logging.
|
||||||
|
enable: true
|
||||||
|
# Enable pretty backtrace (sets RUST_BACKTRACE=1)
|
||||||
|
pretty_backtrace: true
|
||||||
|
# Log level, options: trace, debug, info, warn or error.
|
||||||
|
level: debug
|
||||||
|
# Define the logging format. options: compact, pretty or json
|
||||||
|
format: compact
|
||||||
|
# By default the logger has filtering only logs that came from your code or logs that came from `loco` framework. to see all third party libraries
|
||||||
|
# Uncomment the line below to override to see all third party libraries you can enable this config and override the logger filters.
|
||||||
|
# override_filter: trace
|
||||||
|
|
||||||
|
# Web server configuration
|
||||||
|
server:
|
||||||
|
# Port on which the server will listen. the server binding is 0.0.0.0:{PORT}
|
||||||
|
port: 5150
|
||||||
|
# Binding for the server (which interface to bind to)
|
||||||
|
binding: localhost
|
||||||
|
# The UI hostname or IP address that mailers will point to.
|
||||||
|
host: http://localhost
|
||||||
|
# Out of the box middleware configuration. to disable middleware you can changed the `enable` field to `false` of comment the middleware block
|
||||||
|
middlewares:
|
||||||
|
|
||||||
|
# Initializers Configuration
|
||||||
|
# initializers:
|
||||||
|
# oauth2:
|
||||||
|
# authorization_code: # Authorization code grant type
|
||||||
|
# - client_identifier: google # Identifier for the OAuth2 provider. Replace 'google' with your provider's name if different, must be unique within the oauth2 config.
|
||||||
|
# ... other fields
|
31
examples/usage_example/config/test.yaml
Normal file
31
examples/usage_example/config/test.yaml
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
# Loco configuration file documentation
|
||||||
|
|
||||||
|
# Application logging configuration
|
||||||
|
logger:
|
||||||
|
# Enable or disable logging.
|
||||||
|
enable: false
|
||||||
|
# Enable pretty backtrace (sets RUST_BACKTRACE=1)
|
||||||
|
pretty_backtrace: true
|
||||||
|
# Log level, options: trace, debug, info, warn or error.
|
||||||
|
level: debug
|
||||||
|
# Define the logging format. options: compact, pretty or json
|
||||||
|
format: compact
|
||||||
|
# By default the logger has filtering only logs that came from your code or logs that came from `loco` framework. to see all third party libraries
|
||||||
|
# Uncomment the line below to override to see all third party libraries you can enable this config and override the logger filters.
|
||||||
|
# override_filter: trace
|
||||||
|
|
||||||
|
# Web server configuration
|
||||||
|
server:
|
||||||
|
# Port on which the server will listen. the server binding is 0.0.0.0:{PORT}
|
||||||
|
port: 5150
|
||||||
|
# The UI hostname or IP address that mailers will point to.
|
||||||
|
host: http://localhost
|
||||||
|
# Out of the box middleware configuration. to disable middleware you can changed the `enable` field to `false` of comment the middleware block
|
||||||
|
middlewares:
|
||||||
|
|
||||||
|
# Initializers Configuration
|
||||||
|
# initializers:
|
||||||
|
# oauth2:
|
||||||
|
# authorization_code: # Authorization code grant type
|
||||||
|
# - client_identifier: google # Identifier for the OAuth2 provider. Replace 'google' with your provider's name if different, must be unique within the oauth2 config.
|
||||||
|
# ... other fields
|
59
examples/usage_example/src/app.rs
Normal file
59
examples/usage_example/src/app.rs
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
use async_trait::async_trait;
|
||||||
|
use loco_rs::{
|
||||||
|
app::{AppContext, Hooks, Initializer},
|
||||||
|
bgworker::Queue,
|
||||||
|
boot::{create_app, BootResult, StartMode},
|
||||||
|
config::Config,
|
||||||
|
controller::AppRoutes,
|
||||||
|
environment::Environment,
|
||||||
|
task::Tasks,
|
||||||
|
Result,
|
||||||
|
};
|
||||||
|
|
||||||
|
#[allow(unused_imports)]
|
||||||
|
use crate::{controllers, initializers, tasks};
|
||||||
|
|
||||||
|
pub struct App;
|
||||||
|
#[async_trait]
|
||||||
|
impl Hooks for App {
|
||||||
|
fn app_name() -> &'static str {
|
||||||
|
env!("CARGO_CRATE_NAME")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn app_version() -> String {
|
||||||
|
format!(
|
||||||
|
"{} ({})",
|
||||||
|
env!("CARGO_PKG_VERSION"),
|
||||||
|
option_env!("BUILD_SHA")
|
||||||
|
.or(option_env!("GITHUB_SHA"))
|
||||||
|
.unwrap_or("dev")
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn boot(
|
||||||
|
mode: StartMode,
|
||||||
|
environment: &Environment,
|
||||||
|
config: Config,
|
||||||
|
) -> Result<BootResult> {
|
||||||
|
create_app::<Self>(mode, environment, config).await
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn initializers(_ctx: &AppContext) -> Result<Vec<Box<dyn Initializer>>> {
|
||||||
|
Ok(vec![Box::new(
|
||||||
|
loco_minijinja_engine::MinijinjaViewEngineInitializer,
|
||||||
|
)])
|
||||||
|
}
|
||||||
|
|
||||||
|
fn routes(_ctx: &AppContext) -> AppRoutes {
|
||||||
|
AppRoutes::with_default_routes() // controller routes below
|
||||||
|
.add_route(controllers::home::routes())
|
||||||
|
}
|
||||||
|
async fn connect_workers(_ctx: &AppContext, _queue: &Queue) -> Result<()> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(unused_variables)]
|
||||||
|
fn register_tasks(tasks: &mut Tasks) {
|
||||||
|
// tasks-inject (do not remove)
|
||||||
|
}
|
||||||
|
}
|
7
examples/usage_example/src/bin/main.rs
Normal file
7
examples/usage_example/src/bin/main.rs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
use loco_rs::cli;
|
||||||
|
use usage_example::app::App;
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() -> loco_rs::Result<()> {
|
||||||
|
cli::main::<App>().await
|
||||||
|
}
|
7
examples/usage_example/src/bin/tool.rs
Normal file
7
examples/usage_example/src/bin/tool.rs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
use loco_rs::cli;
|
||||||
|
use usage_example::app::App;
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() -> loco_rs::Result<()> {
|
||||||
|
cli::main::<App>().await
|
||||||
|
}
|
13
examples/usage_example/src/controllers/home.rs
Normal file
13
examples/usage_example/src/controllers/home.rs
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
use axum::debug_handler;
|
||||||
|
use loco_rs::prelude::*;
|
||||||
|
|
||||||
|
use crate::views::home::HomeResponse;
|
||||||
|
|
||||||
|
#[debug_handler]
|
||||||
|
async fn current() -> Result<Response> {
|
||||||
|
format::json(HomeResponse::new("loco"))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn routes() -> Routes {
|
||||||
|
Routes::new().prefix("/api").add("/", get(current))
|
||||||
|
}
|
1
examples/usage_example/src/controllers/mod.rs
Normal file
1
examples/usage_example/src/controllers/mod.rs
Normal file
@ -0,0 +1 @@
|
|||||||
|
pub mod home;
|
1
examples/usage_example/src/initializers/mod.rs
Normal file
1
examples/usage_example/src/initializers/mod.rs
Normal file
@ -0,0 +1 @@
|
|||||||
|
|
5
examples/usage_example/src/lib.rs
Normal file
5
examples/usage_example/src/lib.rs
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
pub mod app;
|
||||||
|
pub mod controllers;
|
||||||
|
pub mod initializers;
|
||||||
|
pub mod tasks;
|
||||||
|
pub mod views;
|
1
examples/usage_example/src/tasks/mod.rs
Normal file
1
examples/usage_example/src/tasks/mod.rs
Normal file
@ -0,0 +1 @@
|
|||||||
|
|
16
examples/usage_example/src/views/home.rs
Normal file
16
examples/usage_example/src/views/home.rs
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
impl HomeResponse {
|
||||||
|
#[must_use]
|
||||||
|
pub fn new(app_name: &str) -> Self {
|
||||||
|
Self {
|
||||||
|
app_name: app_name.to_string(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize, Serialize)]
|
||||||
|
#[allow(clippy::module_name_repetitions)]
|
||||||
|
pub struct HomeResponse {
|
||||||
|
pub app_name: String,
|
||||||
|
}
|
1
examples/usage_example/src/views/mod.rs
Normal file
1
examples/usage_example/src/views/mod.rs
Normal file
@ -0,0 +1 @@
|
|||||||
|
pub mod home;
|
2
examples/usage_example/tests/mod.rs
Normal file
2
examples/usage_example/tests/mod.rs
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
mod requests;
|
||||||
|
mod tasks;
|
15
examples/usage_example/tests/requests/home.rs
Normal file
15
examples/usage_example/tests/requests/home.rs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
use loco_rs::testing::prelude::*;
|
||||||
|
use serial_test::serial;
|
||||||
|
use usage_example::app::App;
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
#[serial]
|
||||||
|
async fn can_get_home() {
|
||||||
|
request::<App, _, _>(|request, _ctx| async move {
|
||||||
|
let res = request.get("/api").await;
|
||||||
|
|
||||||
|
assert_eq!(res.status_code(), 200);
|
||||||
|
res.assert_json(&serde_json::json!({"app_name":"loco"}));
|
||||||
|
})
|
||||||
|
.await;
|
||||||
|
}
|
1
examples/usage_example/tests/requests/mod.rs
Normal file
1
examples/usage_example/tests/requests/mod.rs
Normal file
@ -0,0 +1 @@
|
|||||||
|
mod home;
|
1
examples/usage_example/tests/tasks/mod.rs
Normal file
1
examples/usage_example/tests/tasks/mod.rs
Normal file
@ -0,0 +1 @@
|
|||||||
|
|
Loading…
Reference in New Issue
Block a user