1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
//! Compile controls for the removed A2 response/raw-script bridges.
/// Public renderers return the typed response; callers cannot construct or split
/// it implicitly. The named unchecked exit remains available for reviewed uses.
///
/// ```
/// use axum::response::IntoResponse;
/// use forma_server::{PageResponse, PageConfig, RenderCtx, PageHandle, render_browser_shell};
/// fn respond(page: PageResponse) { let _ = page.into_response(); }
/// fn render<P: forma_ir::PageProps>(page: &PageHandle<P>, value: &P) { let _ = page.render(value, &RenderCtx::new()); }
/// fn shell(config: &PageConfig) { let _ = render_browser_shell(config, &RenderCtx::new()); }
/// fn reviewed(page: PageResponse) { let _ = page.into_parts_unchecked(); }
/// ```
///
/// ```compile_fail
/// use forma_server::PageOutput;
/// ```
/// ```compile_fail
/// use forma_server::render_page;
/// ```
/// ```compile_fail
/// use forma_server::render_page_with_nonce;
/// ```
/// ```compile_fail
/// fn html(page: forma_server::PageResponse) -> String { page.html }
/// ```
/// ```compile_fail
/// fn script(page: &mut forma_server::PageConfig<'_>) { page.config_script = Some("alert(1)"); }
/// ```
/// ```compile_fail
/// fn prefix(page: &mut forma_server::PageConfig<'_>) { page.body_prefix = Some("<nav>raw</nav>"); }
/// ```
/// ```
/// fn prefix<'a>(page: &mut forma_server::PageConfig<'a>, reviewed: &'a forma_server::RawHtml) {
/// page.body_prefix = Some(reviewed);
/// }
/// ```
pub ;
/// Public startup helpers return errors in 3.0 (L-13; DR-12; FORMA-202).
///
/// ```
/// #![deny(deprecated)]
/// fn load<A: rust_embed::Embed>() -> Result<forma_server::AssetManifest, String> {
/// forma_server::assets::load_manifest::<A>()
/// }
/// fn text<A: rust_embed::Embed>(name: &str) -> Result<String, String> {
/// forma_server::assets::asset::<A>(name)
/// }
/// fn nonce() -> Result<forma_server::CspNonce, forma_server::NonceError> {
/// forma_server::CspNonce::generate()
/// }
/// fn nonce_alias() -> Result<forma_server::CspNonce, forma_server::NonceError> {
/// forma_server::generate_csp_nonce()
/// }
/// ```
///
/// The old infallible signatures cannot silently discard these errors.
/// ```compile_fail
/// fn load<A: rust_embed::Embed>() -> forma_server::AssetManifest {
/// forma_server::assets::load_manifest::<A>()
/// }
/// ```
/// ```compile_fail
/// fn text<A: rust_embed::Embed>(name: &str) -> String {
/// forma_server::assets::asset::<A>(name)
/// }
/// ```
/// ```compile_fail
/// fn nonce() -> forma_server::CspNonce { forma_server::CspNonce::generate() }
/// ```
/// ```compile_fail
/// fn nonce() -> forma_server::CspNonce { forma_server::generate_csp_nonce() }
/// ```
pub ;
/// The retired tuple signature cannot be used through the final loader name.
///
/// ```compile_fail
/// fn load<A: rust_embed::Embed + 'static>(manifest: &forma_server::AssetManifest) -> usize {
/// forma_server::load_ir_modules::<A>(manifest).1.len()
/// }
/// ```
pub ;
/// Removed alternate SSR and loader entry points cannot bypass binding.
/// ```compile_fail
/// use forma_server::try_render;
/// ```
/// ```compile_fail
/// use forma_server::load_ir_modules_strict;
/// ```
/// ```compile_fail
/// use forma_server::IrModules;
/// ```
/// ```compile_fail
/// use forma_server::RenderMode;
/// ```
/// ```compile_fail
/// fn raw_module(page: &mut forma_server::PageConfig<'_>) { page.ir_module = None; }
/// ```
/// ```compile_fail
/// fn raw_slots(page: &mut forma_server::PageConfig<'_>) { page.slots = None; }
/// ```
/// ```compile_fail
/// fn raw_prefix() { forma_server::RenderCtx::new().with_body_prefix("raw"); }
/// ```
/// ```
/// use forma_ir::PageProps;
/// use forma_server::{load_ir_modules, PageHandle, RenderCtx, Limits};
/// #[derive(PageProps)] struct Empty {}
/// fn start<A: rust_embed::Embed + 'static>(manifest: &forma_server::AssetManifest) -> Result<PageHandle<Empty>, String> {
/// let pages = load_ir_modules::<A>(manifest).map_err(|e| format!("{e:?}"))?;
/// let home = pages.bind_with("home", Limits::default()).map_err(|e| format!("{e:?}"))?;
/// pages.finalize().map_err(|e| format!("{e:?}"))?;
/// Ok(home)
/// }
/// ```
pub ;