poem-openapi 5.1.16

OpenAPI support for Poem.
Documentation
use poem::{Endpoint, endpoint::make_sync, web::Html};

const RAPIDOC_JS: &str = include_str!("rapidoc-min.js");
const OAUTH_RECEIVER_HTML: &str = include_str!("oauth-receiver.html");

const RAPIDOC_TEMPLATE: &str = r#"
<html charset="UTF-8">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
    <meta name="viewport" content="width=device-width, minimum-scale=1, initial-scale=1, user-scalable=yes">
    <link href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@300;600&family=Roboto+Mono&display=swap" rel="stylesheet">
    <title>RapiDoc</title>
    <script charset="UTF-8">{:script}</script>
</head>
</html>
<body>

    <rapi-doc
        id="thedoc"
        theme="light"
        render-style = "focused"
        show-header	= "false"
        show-components = "true"
        allow-try="true"
        allow-authentication = "true"
        regular-font="Open Sans"
        mono-font = "Roboto Mono"
        font-size = "large"
        schema-description-expanded = "true"	
    >
    </rapi-doc>
    <script>
    document.addEventListener('DOMContentLoaded', (event) => {
        let docEl = document.getElementById("thedoc");
        docEl.loadSpec({:spec});
    })
    </script>

</body>
"#;

pub(crate) fn create_html(document: &str) -> String {
    RAPIDOC_TEMPLATE
        .replace("{:script}", RAPIDOC_JS)
        .replace("{:spec}", document)
}

pub(crate) fn create_endpoint(document: String) -> impl Endpoint {
    let ui_html = create_html(&document);
    let oauth_receiver_html = OAUTH_RECEIVER_HTML.replace("{:script}", RAPIDOC_JS);

    poem::Route::new()
        .at("/", make_sync(move |_| Html(ui_html.clone())))
        .at(
            "/oauth-receiver.html",
            make_sync(move |_| Html(oauth_receiver_html.clone())),
        )
}