vyuh 0.2.6

Vyuh web framework for Axum and SQLx with handler-first APIs
Documentation
//! Exposing a trait facade from a concrete service.
//!
//! Run:
//!
//! ```sh
//! cargo run --example services_facade
//! ```

use std::sync::Arc;
use vyuh::{
    bundles,
    routes::Html,
    services::{Service, ServiceError, ServiceExposer, ServiceInstance, ServiceRef},
};

trait Greeter: Send + Sync {
    fn greet(&self, name: &str) -> String;
}

struct FriendlyGreeter;

impl Greeter for FriendlyGreeter {
    fn greet(&self, name: &str) -> String {
        format!("hello {name}")
    }
}

impl Service for FriendlyGreeter {
    fn expose(exposer: &mut ServiceExposer<Self>) -> Result<(), ServiceError> {
        exposer.expose(|service| service as Arc<dyn Greeter>)
    }
}

#[bundles::service]
async fn friendly_greeter() -> ServiceInstance<FriendlyGreeter> {
    FriendlyGreeter.into()
}

#[bundles::route(path = "/hello")]
async fn hello(greeter: ServiceRef<dyn Greeter>) -> Html<String> {
    Html(greeter.greet("Vyuh"))
}

fn main() {
    let bundle = bundles::bundle! {
        friendly_greeter,
        hello,
    };

    assert_eq!(bundle.reverse("hello", &[]), Some("/hello".to_string()));
    println!("service facade registered");
}