html_form_actions 0.2.0

Generate HTML Form parsers and routing logic for Form Actions
Documentation
use crate::{BuildExt, actions};
#[test]
fn basic() {
    #[actions(picoserve)]
    mod page {
        use crate as html_form_actions;

        const PATH: &str = "/basic";

        async fn page_handler() -> impl picoserve::response::IntoResponse {
            (
                ("Content-Type", "text/html; charset=utf-8"),
                maud::html! {
                    @let basic_action::Form { action, a_name } = basic_action::FORM;
                    form action=(action) {
                        label { "A" input name=(a_name); }
                    }
                }
                .into_string(),
            )
        }

        #[action]
        async fn basic_action(#[form_input] a: i32) -> String {
            std::format!("a = {a}")
        }

        pub fn route<R: picoserve::routing::PathRouter>(
            router: picoserve::Router<R>,
        ) -> picoserve::Router<impl picoserve::routing::PathRouter> {
            router.route(
                PATH,
                picoserve::routing::get(page_handler).post_service(ActionsHandler),
            )
        }
    }

    picoserve::Router::new().with(page::route);
}

#[test]
fn named_form() {
    #[actions(picoserve(form = named_form::NamedForm))]
    mod page {
        use crate as html_form_actions;

        mod named_form {
            pub use picoserve::extract::Form as NamedForm;
        }

        const PATH: &str = "/named_form";

        async fn page_handler() -> impl picoserve::response::IntoResponse {
            (
                ("Content-Type", "text/html; charset=utf-8"),
                maud::html! {
                    @let named_form_action::Form { action, a_name } = named_form_action::FORM;
                    form action=(action) {
                        label { "A" input name=(a_name); }
                    }
                }
                .into_string(),
            )
        }

        #[action]
        async fn named_form_action(#[form_input] a: i32) -> String {
            std::format!("a = {a}")
        }

        pub fn route<R: picoserve::routing::PathRouter>(
            router: picoserve::Router<R>,
        ) -> picoserve::Router<impl picoserve::routing::PathRouter> {
            router.route(
                PATH,
                picoserve::routing::get(page_handler).post_service(ActionsHandler),
            )
        }
    }

    picoserve::Router::new().with(page::route);
}

#[test]
fn named_handler() {
    #[actions(picoserve(handler = NamedActionsHandler))]
    mod page {
        use crate as html_form_actions;

        const PATH: &str = "/named_handler";

        async fn page_handler() -> impl picoserve::response::IntoResponse {
            (
                ("Content-Type", "text/html; charset=utf-8"),
                maud::html! {
                    @let named_handler_action::Form { action, a_name } = named_handler_action::FORM;
                    form action=(action) {
                        label { "A" input name=(a_name); }
                    }
                }
                .into_string(),
            )
        }

        #[action]
        async fn named_handler_action(#[form_input] a: i32) -> String {
            std::format!("a = {a}")
        }

        pub fn route<R: picoserve::routing::PathRouter>(
            router: picoserve::Router<R>,
        ) -> picoserve::Router<impl picoserve::routing::PathRouter> {
            router.route(
                PATH,
                picoserve::routing::get(page_handler).post_service(NamedActionsHandler),
            )
        }
    }

    picoserve::Router::new().with(page::route);
}