#[non_exhaustive]pub struct ErrorPage<'a> {
pub status: u16,
pub title: &'a str,
pub message: &'a str,
pub reference: &'a str,
pub base: &'a str,
}Expand description
What an error page shows: the status, its generic title and message, and the request’s reference. Never the code or the cause.
base is the site’s base path ("" at the root, /blog for a site
installed in a folder), so the page’s links and stylesheets point inside
the site: url builds them as Context::url
does for pages.
use web_net::{App, ErrorPage, Output, Render, RenderError, TemplateId, View, get};
/// No templates; its own error pages.
struct Plain;
impl Render for Plain {
type View<'a> = dyn View + 'a;
fn template(&self, _: &str) -> Option<TemplateId> { None }
fn render(&self, _: TemplateId, _: &dyn View, _: &mut Output<'_>) -> Result<(), RenderError> { Ok(()) }
fn error_page(&self, page: &ErrorPage<'_>, out: &mut Output<'_>) -> Result<bool, RenderError> {
out.write_str(&format!("{} {}", page.status, page.title))?;
Ok(true)
}
}
let app = App::builder().render(Plain).route(get("/", |cx| cx.text(200, "home"))).build()?;
let r = serve_net::testing::respond(&app, b"GET /missing HTTP/1.1\r\nHost: localhost\r\n\r\n");
assert_eq!((r.status, r.text()), (404, "404 Not Found"));Fields (Non-exhaustive)§
This struct is marked as non-exhaustive
Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.status: u16The status (404).
title: &'a strIts generic title (Not Found).
message: &'a strIts generic message.
reference: &'a strThe request’s reference, as the visitor quotes it.
base: &'a strThe site’s base path: "" at the root, /blog in a folder; never a
trailing slash.
Implementations§
Source§impl<'a> ErrorPage<'a>
impl<'a> ErrorPage<'a>
Sourcepub const fn new(
status: u16,
title: &'a str,
message: &'a str,
reference: &'a str,
) -> Self
pub const fn new( status: u16, title: &'a str, message: &'a str, reference: &'a str, ) -> Self
An error page’s facts at the site’s root, for an engine’s own tests (web-net makes the real ones).
let p = web_net::ErrorPage::new(404, "Not Found", "The page was not found.", "1a-2");
assert_eq!((p.status, p.reference, p.base), (404, "1a-2", ""));Sourcepub const fn with_base(self, base: &'a str) -> Self
pub const fn with_base(self, base: &'a str) -> Self
The same page for a site installed under base (/blog).
let p = web_net::ErrorPage::new(404, "Not Found", "-", "r").with_base("/blog");
assert_eq!(p.url("/static/site.css").unwrap(), "/blog/static/site.css");Sourcepub fn url(&self, path: &str) -> Result<String, RenderError>
pub fn url(&self, path: &str) -> Result<String, RenderError>
A site path as a URL path, the base path in front: what the page’s links and stylesheets use, so they work for a site in a folder.
let root = web_net::ErrorPage::new(500, "Server Error", "-", "r");
assert_eq!(root.url("/")?, "/");
let blog = root.with_base("/blog");
assert_eq!(blog.url("/static/site.css")?, "/blog/static/site.css");
assert!(blog.url("//elsewhere.example").is_err());§Errors
RenderError url.not_local when path is not a path of the site
(as for Context::url).