| 995 | } |
| 996 | |
| 997 | fn build_swagger_ui_html(spec_url: &str, cfg: &SwaggerUiConfig) -> String { |
| 998 | let spec = spec_url.replace('\'', "\\'"); |
| 999 | let css = format!( |
| 1000 | "{}/swagger-ui.css", |
| 1001 | cfg.swagger_ui_dist.trim_end_matches('/') |
| 1002 | ); |
| 1003 | let bundle = format!( |
| 1004 | "{}/swagger-ui-bundle.js", |
| 1005 | cfg.swagger_ui_dist.trim_end_matches('/') |
| 1006 | ); |
| 1007 | let preset = format!( |
| 1008 | "{}/swagger-ui-standalone-preset.js", |
| 1009 | cfg.swagger_ui_dist.trim_end_matches('/') |
| 1010 | ); |
| 1011 | let background = if cfg.dark_mode { "#0b0d10" } else { "#fafafa" }; |
| 1012 | format!( |
| 1013 | r#"<!DOCTYPE html> |
| 1014 | <html lang="en"> |
| 1015 | <head> |
| 1016 | <meta charset="utf-8" /> |
| 1017 | <title>{title}</title> |
| 1018 | <link rel="stylesheet" href="{css}" /> |
| 1019 | <style> |
| 1020 | body {{ |
| 1021 | margin: 0; |
| 1022 | background-color: {background}; |
| 1023 | }} |
| 1024 | .swagger-ui .topbar {{ |
| 1025 | display: none; |
| 1026 | }} |
| 1027 | </style> |
| 1028 | </head> |
| 1029 | <body> |
| 1030 | <div id="swagger-ui"></div> |
| 1031 | <script src="{bundle}"></script> |
| 1032 | <script src="{preset}"></script> |
| 1033 | <script> |
| 1034 | window.onload = () => {{ |
| 1035 | window.ui = SwaggerUIBundle({{ |
| 1036 | url: '{spec}', |
| 1037 | dom_id: '#swagger-ui', |
| 1038 | deepLinking: true, |
| 1039 | presets: [ |
| 1040 | SwaggerUIBundle.presets.apis, |
| 1041 | SwaggerUIStandalonePreset |
| 1042 | ], |
| 1043 | layout: "BaseLayout", |
| 1044 | requestInterceptor: (req) => {{ |
| 1045 | const method = (req.method || '').toUpperCase(); |
| 1046 | if (method === 'POST') {{ |
| 1047 | req.headers = req.headers || {{}}; |
| 1048 | if (!req.headers['Content-Type'] && !req.headers['content-type']) {{ |
| 1049 | req.headers['Content-Type'] = 'application/json'; |
| 1050 | }} |
| 1051 | }} |
| 1052 | return req; |
| 1053 | }} |
| 1054 | }}); |