actix-web - toy-rpc Book

# HTTP integration with `actix-web`

The `"http_actix_web"` feature flag should be toggled on to enable HTTP integration with `actix-web`. Enabling `"http_actix_web"` feature flag will also enable the `"tokio_runtime"` feature flag.

A convenience method `Server::handle_http()` is available when `"http_actix_web"` is the only enabled http integration feature flag. If you have multiple http integration feature flags enabled, you can use the `Server::scope_config` method instead (please note that you should use `scope_config` without brackets).

We will demonstrate the usage with a new example.

    [dependencies]
    actix-web = "3.3.2"
    toy-rpc = { version = "0.7.5", features = ["http_actix_web", "server"] }

    use std::sync::Arc;
    use toy_rpc::macros::export_impl;
    use toy_rpc::Server;
    use actix_web::{web, HttpServer, App};

    pub struct Calculator { }

    #[export_impl]
    impl Calculator {
        #[export_method]
        async fn multiply(&self, args(i32, i32)) -> Result<i32, String> {
            Ok(args.0 * args.1)
        }

        #[export_method]
        async fn divide(&self, args(i32, i32)) -> Result<i32, String> {
            Ok(args.0 / args.1)
        }
    }

    #[actix_web::main]
    async fn main() {
        let addr = "127.0.0.1:23333";
        let calculator = Arc::new(Calculator { });
        let server = Server::builder()
            .register(calculator)
            .build();

        let app_data = web::Data::new(server);

        HttpServer::new(
            move || {
                App::new()
                    .service(
                        web::scope("/rpc/")
                            .app_data(app_data.clone())
                            .configure(Server::handle_http()) // equivalent to the line below
                            // .configure(Server::scope_config)
                    )
            }
        )
        .bind(addr).unwrap()
        .run()
        .await;
    }