#[error("not a valid resource path")]
struct UnknownResource;
+impl ResponseError for UnknownResource {
+ fn status_code(&self) -> StatusCode { StatusCode::NOT_FOUND }
+ fn error_response(&self) -> HttpResponse<BoxBody> { error_response(self) }
+}
+
+// Magically looks for "{leaf}"
+impl FromRequest for CheckedResourceLeaf {
+ type Error = UnknownResource;
+ type Future = future::Ready<Result<CheckedResourceLeaf, UnknownResource>>;
+ fn from_request(req: &HttpRequest, _: &mut actix_web::dev::Payload)
+ -> Self::Future {
+ future::ready(
+ req.match_info().query("leaf").parse()
+ )
+ }
+}
+
impl FromStr for CheckedResourceLeaf {
type Err = UnknownResource;
fn from_str(s: &str) -> Result<Self, Self::Err> {
#[route("/_/{leaf}", method="GET", method="HEAD")]
#[throws(io::Error)]
-async fn resource(leaf: Path<Parse<CheckedResourceLeaf>>) -> impl Responder {
- let leaf = leaf.into_inner().0;
+async fn resource(leaf: CheckedResourceLeaf) -> impl Responder {
let path = match leaf.locn {
RL::Main => format!("{}/{}", config().template_dir, leaf.safe_leaf),
RL::Wasm(s) => format!("{}/{}", config().wasm_dir, s),