diff --git a/implementors/core/clone/trait.Clone.js b/implementors/core/clone/trait.Clone.js
index 8f19b57a..8132c4bb 100644
--- a/implementors/core/clone/trait.Clone.js
+++ b/implementors/core/clone/trait.Clone.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"tide_disco":[["impl Clone for ApiVersion"],["impl Clone for HealthStatus"],["impl<AppState: Clone> Clone for ServerState<AppState>"],["impl Clone for AppHealth"],["impl Clone for RequestParamValue"],["impl Clone for UrlSegment"],["impl Clone for ServerError"],["impl Clone for RequestError"],["impl Clone for ApiMetadata"],["impl Clone for AppVersion"],["impl Clone for RequestParam"],["impl Clone for RequestParams"],["impl Clone for HealthStatus"],["impl Clone for AppError"],["impl Clone for RouteParseError"],["impl Clone for ApiError"],["impl Clone for RequestParamType"],["impl Clone for Method"]]
+"tide_disco":[["impl Clone for RouteParseError"],["impl Clone for OutOfRangeError"],["impl Clone for Method"],["impl Clone for UrlSegment"],["impl Clone for ApiVersion"],["impl Clone for ApiError"],["impl Clone for RequestError"],["impl Clone for AppError"],["impl Clone for AppVersion"],["impl Clone for RequestParamValue"],["impl Clone for StatusCode"],["impl Clone for RequestParamType"],["impl<AppState: Clone> Clone for ServerState<AppState>"],["impl Clone for RequestParams"],["impl Clone for RequestParam"],["impl Clone for ApiMetadata"],["impl Clone for HealthStatus"],["impl Clone for ServerError"],["impl Clone for AppHealth"],["impl Clone for HealthStatus"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/cmp/trait.Eq.js b/implementors/core/cmp/trait.Eq.js
index 8a3100b8..86c91c91 100644
--- a/implementors/core/cmp/trait.Eq.js
+++ b/implementors/core/cmp/trait.Eq.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"tide_disco":[["impl Eq for Method"],["impl Eq for AppVersion"],["impl Eq for HealthStatus"],["impl Eq for RequestParamValue"],["impl Eq for AppHealth"],["impl Eq for ServerError"],["impl Eq for ApiVersion"],["impl Eq for RequestParamType"]]
+"tide_disco":[["impl Eq for AppHealth"],["impl Eq for StatusCode"],["impl Eq for RequestParamType"],["impl Eq for RequestParamValue"],["impl Eq for HealthStatus"],["impl Eq for ApiVersion"],["impl Eq for Method"],["impl Eq for ServerError"],["impl Eq for AppVersion"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/cmp/trait.PartialEq.js b/implementors/core/cmp/trait.PartialEq.js
index 4f0b2948..3924857c 100644
--- a/implementors/core/cmp/trait.PartialEq.js
+++ b/implementors/core/cmp/trait.PartialEq.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"tide_disco":[["impl PartialEq<RequestParamValue> for RequestParamValue"],["impl PartialEq<AppHealth> for AppHealth"],["impl PartialEq<HealthStatus> for HealthStatus"],["impl PartialEq<ApiVersion> for ApiVersion"],["impl PartialEq<AppVersion> for AppVersion"],["impl PartialEq<Method> for Method"],["impl PartialEq<RequestParamType> for RequestParamType"],["impl PartialEq<ServerError> for ServerError"]]
+"tide_disco":[["impl PartialEq<ServerError> for ServerError"],["impl PartialEq<StatusCode> for StatusCode"],["impl PartialEq<StatusCode> for StatusCode"],["impl PartialEq<Method> for Method"],["impl PartialEq<RequestParamType> for RequestParamType"],["impl PartialEq<AppHealth> for AppHealth"],["impl PartialEq<AppVersion> for AppVersion"],["impl PartialEq<ApiVersion> for ApiVersion"],["impl PartialEq<HealthStatus> for HealthStatus"],["impl PartialEq<RequestParamValue> for RequestParamValue"],["impl PartialEq<StatusCode> for StatusCode"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/convert/trait.AsRef.js b/implementors/core/convert/trait.AsRef.js
index 8ab3df5f..8d14dbbf 100644
--- a/implementors/core/convert/trait.AsRef.js
+++ b/implementors/core/convert/trait.AsRef.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"tide_disco":[["impl AsRef<str> for HealthStatus"],["impl AsRef<str> for DiscoKey"]]
+"tide_disco":[["impl AsRef<str> for DiscoKey"],["impl AsRef<str> for HealthStatus"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/convert/trait.From.js b/implementors/core/convert/trait.From.js
index b3a5dae5..7549fe92 100644
--- a/implementors/core/convert/trait.From.js
+++ b/implementors/core/convert/trait.From.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"tide_disco":[["impl From<RequestError> for ServerError"],["impl<E> From<Error> for SocketError<E>"],["impl<E: Display> From<SocketError<E>> for ServerError"],["impl From<ConfigError> for ServerError"],["impl From<Method> for Method"],["impl<E: Display> From<RouteError<E>> for ServerError"],["impl From<Error> for ServerError"],["impl<E> From<RequestError> for RouteError<E>"],["impl<E> From<Box<ErrorKind, Global>> for SocketError<E>"],["impl<E> From<Error> for SocketError<E>"],["impl<E> From<RequestError> for SocketError<E>"]]
+"tide_disco":[["impl<E> From<Box<ErrorKind, Global>> for SocketError<E>"],["impl From<RequestError> for ServerError"],["impl<E> From<Error> for SocketError<E>"],["impl From<StatusCode> for StatusCode"],["impl<E: Display> From<SocketError<E>> for ServerError"],["impl<E: Display> From<RouteError<E>> for ServerError"],["impl From<Error> for ServerError"],["impl From<ConfigError> for ServerError"],["impl From<Method> for Method"],["impl From<StatusCode> for StatusCode"],["impl<E> From<Error> for SocketError<E>"],["impl<E> From<RequestError> for RouteError<E>"],["impl From<StatusCode> for u16"],["impl<E> From<RequestError> for SocketError<E>"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/convert/trait.TryFrom.js b/implementors/core/convert/trait.TryFrom.js
index 72b1cba5..3fbd0436 100644
--- a/implementors/core/convert/trait.TryFrom.js
+++ b/implementors/core/convert/trait.TryFrom.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"tide_disco":[["impl TryFrom<&str> for RequestParamType"],["impl TryFrom<&str> for UrlSegment"]]
+"tide_disco":[["impl TryFrom<&str> for UrlSegment"],["impl TryFrom<u16> for StatusCode"],["impl TryFrom<&str> for RequestParamType"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/error/trait.Error.js b/implementors/core/error/trait.Error.js
index f86260be..3a16d663 100644
--- a/implementors/core/error/trait.Error.js
+++ b/implementors/core/error/trait.Error.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"tide_disco":[["impl Error for ApiErrorwhere\n Self: Debug + Display,"],["impl Error for RouteParseErrorwhere\n Self: Debug + Display,"],["impl Error for ServerErrorwhere\n Self: Debug + Display,"],["impl Error for RequestErrorwhere\n Self: Debug + Display,"],["impl Error for AppErrorwhere\n Self: Debug + Display,"]]
+"tide_disco":[["impl Error for OutOfRangeErrorwhere\n Self: Debug + Display,"],["impl Error for ApiErrorwhere\n Self: Debug + Display,"],["impl Error for ServerErrorwhere\n Self: Debug + Display,"],["impl Error for RequestErrorwhere\n Self: Debug + Display,"],["impl Error for AppErrorwhere\n Self: Debug + Display,"],["impl Error for RouteParseErrorwhere\n Self: Debug + Display,"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/fmt/trait.Debug.js b/implementors/core/fmt/trait.Debug.js
index cedf650b..52fee2e7 100644
--- a/implementors/core/fmt/trait.Debug.js
+++ b/implementors/core/fmt/trait.Debug.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"tide_disco":[["impl Debug for RouteParseError"],["impl<E: Debug> Debug for SocketError<E>"],["impl Debug for RequestParamType"],["impl Debug for Method"],["impl Debug for AppVersion"],["impl Debug for ApiMetadata"],["impl Debug for ApiError"],["impl Debug for RequestParam"],["impl Debug for RequestError"],["impl Debug for ApiVersion"],["impl Debug for HealthStatus"],["impl Debug for RequestParamValue"],["impl Debug for AppHealth"],["impl Debug for DiscoKey"],["impl Debug for DiscoArgs"],["impl Debug for UrlSegment"],["impl Debug for AppError"],["impl Debug for HealthStatus"],["impl<State, Error> Debug for Api<State, Error>"],["impl Debug for ServerError"],["impl<State, Error> Debug for Route<State, Error>"],["impl Debug for RequestParams"]]
+"tide_disco":[["impl Debug for AppError"],["impl Debug for RequestParamType"],["impl Debug for ServerError"],["impl Debug for DiscoKey"],["impl<State, Error> Debug for Api<State, Error>"],["impl Debug for ApiError"],["impl Debug for RouteParseError"],["impl Debug for HealthStatus"],["impl<State, Error> Debug for Route<State, Error>"],["impl Debug for AppVersion"],["impl Debug for RequestError"],["impl Debug for RequestParam"],["impl Debug for ApiVersion"],["impl Debug for HealthStatus"],["impl<E: Debug> Debug for SocketError<E>"],["impl Debug for Method"],["impl Debug for RequestParams"],["impl Debug for AppHealth"],["impl Debug for UrlSegment"],["impl Debug for DiscoArgs"],["impl Debug for ApiMetadata"],["impl Debug for OutOfRangeError"],["impl Debug for RequestParamValue"],["impl Debug for StatusCode"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/fmt/trait.Display.js b/implementors/core/fmt/trait.Display.js
index 1598366d..706a08b1 100644
--- a/implementors/core/fmt/trait.Display.js
+++ b/implementors/core/fmt/trait.Display.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"tide_disco":[["impl Display for RequestError"],["impl Display for AppError"],["impl Display for HealthStatus"],["impl<E: Display> Display for RouteError<E>"],["impl<E: Display> Display for SocketError<E>"],["impl Display for RouteParseError"],["impl Display for Method"],["impl Display for RequestParamType"],["impl Display for ServerError"],["impl Display for ApiError"]]
+"tide_disco":[["impl<E: Display> Display for RouteError<E>"],["impl Display for AppError"],["impl Display for HealthStatus"],["impl Display for RequestParamType"],["impl<E: Display> Display for SocketError<E>"],["impl Display for ServerError"],["impl Display for OutOfRangeError"],["impl Display for ApiError"],["impl Display for RouteParseError"],["impl Display for StatusCode"],["impl Display for Method"],["impl Display for RequestError"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/hash/trait.Hash.js b/implementors/core/hash/trait.Hash.js
new file mode 100644
index 00000000..01a5ae8a
--- /dev/null
+++ b/implementors/core/hash/trait.Hash.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"tide_disco":[["impl Hash for StatusCode"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/iter/traits/collect/trait.IntoIterator.js b/implementors/core/iter/traits/collect/trait.IntoIterator.js
index 9e95e64c..0d644062 100644
--- a/implementors/core/iter/traits/collect/trait.IntoIterator.js
+++ b/implementors/core/iter/traits/collect/trait.IntoIterator.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"tide_disco":[["impl<State, Error> IntoIterator for Api<State, Error>"],["impl<'a, State, Error> IntoIterator for &'a Api<State, Error>"]]
+"tide_disco":[["impl<'a, State, Error> IntoIterator for &'a Api<State, Error>"],["impl<State, Error> IntoIterator for Api<State, Error>"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/marker/trait.Copy.js b/implementors/core/marker/trait.Copy.js
index 12653655..a66abe6c 100644
--- a/implementors/core/marker/trait.Copy.js
+++ b/implementors/core/marker/trait.Copy.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"tide_disco":[["impl Copy for Method"],["impl Copy for HealthStatus"],["impl Copy for RequestParamType"]]
+"tide_disco":[["impl Copy for StatusCode"],["impl Copy for Method"],["impl Copy for HealthStatus"],["impl Copy for RequestParamType"],["impl Copy for OutOfRangeError"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/marker/trait.Freeze.js b/implementors/core/marker/trait.Freeze.js
index b617b83a..5f500b6f 100644
--- a/implementors/core/marker/trait.Freeze.js
+++ b/implementors/core/marker/trait.Freeze.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"tide_disco":[["impl Freeze for ApiError",1,["tide_disco::api::ApiError"]],["impl Freeze for ApiVersion",1,["tide_disco::api::ApiVersion"]],["impl Freeze for ApiMetadata",1,["tide_disco::api::ApiMetadata"]],["impl<State, Error> Freeze for Api<State, Error>",1,["tide_disco::api::Api"]],["impl<'a, State, Error> Freeze for RoutesWithPath<'a, State, Error>",1,["tide_disco::api::RoutesWithPath"]],["impl<State, Error> Freeze for App<State, Error>",1,["tide_disco::app::App"]],["impl Freeze for AppError",1,["tide_disco::app::AppError"]],["impl Freeze for AppHealth",1,["tide_disco::app::AppHealth"]],["impl Freeze for AppVersion",1,["tide_disco::app::AppVersion"]],["impl<'a, State, Error, ModuleError> Freeze for Module<'a, State, Error, ModuleError>",1,["tide_disco::app::Module"]],["impl Freeze for ServerError",1,["tide_disco::error::ServerError"]],["impl Freeze for HealthStatus",1,["tide_disco::healthcheck::HealthStatus"]],["impl Freeze for Method",1,["tide_disco::method::Method"]],["impl Freeze for ParseMethodError",1,["tide_disco::method::ParseMethodError"]],["impl Freeze for RequestError",1,["tide_disco::request::RequestError"]],["impl Freeze for RequestParams",1,["tide_disco::request::RequestParams"]],["impl Freeze for RequestParamValue",1,["tide_disco::request::RequestParamValue"]],["impl Freeze for RequestParamType",1,["tide_disco::request::RequestParamType"]],["impl Freeze for RequestParam",1,["tide_disco::request::RequestParam"]],["impl<E> Freeze for RouteError<E>where\n E: Freeze,",1,["tide_disco::route::RouteError"]],["impl<State, Error> Freeze for Route<State, Error>",1,["tide_disco::route::Route"]],["impl Freeze for RouteParseError",1,["tide_disco::route::RouteParseError"]],["impl<H, F, E> Freeze for MapErr<H, F, E>where\n F: Freeze,\n H: Freeze,",1,["tide_disco::route::MapErr"]],["impl<E> Freeze for SocketError<E>where\n E: Freeze,",1,["tide_disco::socket::SocketError"]],["impl<ToClient: ?Sized, FromClient, Error> Freeze for Connection<ToClient, FromClient, Error>",1,["tide_disco::socket::Connection"]],["impl Freeze for DiscoArgs",1,["tide_disco::DiscoArgs"]],["impl Freeze for DiscoKey",1,["tide_disco::DiscoKey"]],["impl Freeze for HealthStatus",1,["tide_disco::HealthStatus"]],["impl<AppState> Freeze for ServerState<AppState>where\n AppState: Freeze,",1,["tide_disco::ServerState"]],["impl Freeze for UrlSegment",1,["tide_disco::UrlSegment"]]]
+"tide_disco":[["impl Freeze for ApiError",1,["tide_disco::api::ApiError"]],["impl Freeze for ApiVersion",1,["tide_disco::api::ApiVersion"]],["impl Freeze for ApiMetadata",1,["tide_disco::api::ApiMetadata"]],["impl<State, Error> Freeze for Api<State, Error>",1,["tide_disco::api::Api"]],["impl<'a, State, Error> Freeze for RoutesWithPath<'a, State, Error>",1,["tide_disco::api::RoutesWithPath"]],["impl<State, Error> Freeze for App<State, Error>",1,["tide_disco::app::App"]],["impl Freeze for AppError",1,["tide_disco::app::AppError"]],["impl Freeze for AppHealth",1,["tide_disco::app::AppHealth"]],["impl Freeze for AppVersion",1,["tide_disco::app::AppVersion"]],["impl<'a, State, Error, ModuleError> Freeze for Module<'a, State, Error, ModuleError>",1,["tide_disco::app::Module"]],["impl Freeze for ServerError",1,["tide_disco::error::ServerError"]],["impl Freeze for HealthStatus",1,["tide_disco::healthcheck::HealthStatus"]],["impl Freeze for Method",1,["tide_disco::method::Method"]],["impl Freeze for ParseMethodError",1,["tide_disco::method::ParseMethodError"]],["impl Freeze for RequestError",1,["tide_disco::request::RequestError"]],["impl Freeze for RequestParams",1,["tide_disco::request::RequestParams"]],["impl Freeze for RequestParamValue",1,["tide_disco::request::RequestParamValue"]],["impl Freeze for RequestParamType",1,["tide_disco::request::RequestParamType"]],["impl Freeze for RequestParam",1,["tide_disco::request::RequestParam"]],["impl<E> Freeze for RouteError<E>where\n E: Freeze,",1,["tide_disco::route::RouteError"]],["impl<State, Error> Freeze for Route<State, Error>",1,["tide_disco::route::Route"]],["impl Freeze for RouteParseError",1,["tide_disco::route::RouteParseError"]],["impl<H, F, E> Freeze for MapErr<H, F, E>where\n F: Freeze,\n H: Freeze,",1,["tide_disco::route::MapErr"]],["impl<E> Freeze for SocketError<E>where\n E: Freeze,",1,["tide_disco::socket::SocketError"]],["impl<ToClient: ?Sized, FromClient, Error> Freeze for Connection<ToClient, FromClient, Error>",1,["tide_disco::socket::Connection"]],["impl Freeze for StatusCode",1,["tide_disco::status::StatusCode"]],["impl Freeze for OutOfRangeError",1,["tide_disco::status::OutOfRangeError"]],["impl Freeze for DiscoArgs",1,["tide_disco::DiscoArgs"]],["impl Freeze for DiscoKey",1,["tide_disco::DiscoKey"]],["impl Freeze for HealthStatus",1,["tide_disco::HealthStatus"]],["impl<AppState> Freeze for ServerState<AppState>where\n AppState: Freeze,",1,["tide_disco::ServerState"]],["impl Freeze for UrlSegment",1,["tide_disco::UrlSegment"]]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/marker/trait.Send.js b/implementors/core/marker/trait.Send.js
index 7fa275f2..a03e0a06 100644
--- a/implementors/core/marker/trait.Send.js
+++ b/implementors/core/marker/trait.Send.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"tide_disco":[["impl Send for ApiError",1,["tide_disco::api::ApiError"]],["impl Send for ApiVersion",1,["tide_disco::api::ApiVersion"]],["impl Send for ApiMetadata",1,["tide_disco::api::ApiMetadata"]],["impl<State, Error> Send for Api<State, Error>",1,["tide_disco::api::Api"]],["impl<'a, State, Error> Send for RoutesWithPath<'a, State, Error>",1,["tide_disco::api::RoutesWithPath"]],["impl<State, Error> Send for App<State, Error>where\n State: Send + Sync,",1,["tide_disco::app::App"]],["impl Send for AppError",1,["tide_disco::app::AppError"]],["impl Send for AppHealth",1,["tide_disco::app::AppHealth"]],["impl Send for AppVersion",1,["tide_disco::app::AppVersion"]],["impl<'a, State, Error, ModuleError> Send for Module<'a, State, Error, ModuleError>",1,["tide_disco::app::Module"]],["impl Send for ServerError",1,["tide_disco::error::ServerError"]],["impl Send for HealthStatus",1,["tide_disco::healthcheck::HealthStatus"]],["impl Send for Method",1,["tide_disco::method::Method"]],["impl Send for ParseMethodError",1,["tide_disco::method::ParseMethodError"]],["impl Send for RequestError",1,["tide_disco::request::RequestError"]],["impl Send for RequestParams",1,["tide_disco::request::RequestParams"]],["impl Send for RequestParamValue",1,["tide_disco::request::RequestParamValue"]],["impl Send for RequestParamType",1,["tide_disco::request::RequestParamType"]],["impl Send for RequestParam",1,["tide_disco::request::RequestParam"]],["impl<E> Send for RouteError<E>where\n E: Send,",1,["tide_disco::route::RouteError"]],["impl<State, Error> Send for Route<State, Error>",1,["tide_disco::route::Route"]],["impl Send for RouteParseError",1,["tide_disco::route::RouteParseError"]],["impl<H, F, E> Send for MapErr<H, F, E>where\n E: Send,\n F: Send,\n H: Send,",1,["tide_disco::route::MapErr"]],["impl<E> Send for SocketError<E>where\n E: Send,",1,["tide_disco::socket::SocketError"]],["impl<ToClient: ?Sized, FromClient, Error> Send for Connection<ToClient, FromClient, Error>",1,["tide_disco::socket::Connection"]],["impl Send for DiscoArgs",1,["tide_disco::DiscoArgs"]],["impl Send for DiscoKey",1,["tide_disco::DiscoKey"]],["impl Send for HealthStatus",1,["tide_disco::HealthStatus"]],["impl<AppState> Send for ServerState<AppState>where\n AppState: Send,",1,["tide_disco::ServerState"]],["impl Send for UrlSegment",1,["tide_disco::UrlSegment"]]]
+"tide_disco":[["impl Send for ApiError",1,["tide_disco::api::ApiError"]],["impl Send for ApiVersion",1,["tide_disco::api::ApiVersion"]],["impl Send for ApiMetadata",1,["tide_disco::api::ApiMetadata"]],["impl<State, Error> Send for Api<State, Error>",1,["tide_disco::api::Api"]],["impl<'a, State, Error> Send for RoutesWithPath<'a, State, Error>",1,["tide_disco::api::RoutesWithPath"]],["impl<State, Error> Send for App<State, Error>where\n State: Send + Sync,",1,["tide_disco::app::App"]],["impl Send for AppError",1,["tide_disco::app::AppError"]],["impl Send for AppHealth",1,["tide_disco::app::AppHealth"]],["impl Send for AppVersion",1,["tide_disco::app::AppVersion"]],["impl<'a, State, Error, ModuleError> Send for Module<'a, State, Error, ModuleError>",1,["tide_disco::app::Module"]],["impl Send for ServerError",1,["tide_disco::error::ServerError"]],["impl Send for HealthStatus",1,["tide_disco::healthcheck::HealthStatus"]],["impl Send for Method",1,["tide_disco::method::Method"]],["impl Send for ParseMethodError",1,["tide_disco::method::ParseMethodError"]],["impl Send for RequestError",1,["tide_disco::request::RequestError"]],["impl Send for RequestParams",1,["tide_disco::request::RequestParams"]],["impl Send for RequestParamValue",1,["tide_disco::request::RequestParamValue"]],["impl Send for RequestParamType",1,["tide_disco::request::RequestParamType"]],["impl Send for RequestParam",1,["tide_disco::request::RequestParam"]],["impl<E> Send for RouteError<E>where\n E: Send,",1,["tide_disco::route::RouteError"]],["impl<State, Error> Send for Route<State, Error>",1,["tide_disco::route::Route"]],["impl Send for RouteParseError",1,["tide_disco::route::RouteParseError"]],["impl<H, F, E> Send for MapErr<H, F, E>where\n E: Send,\n F: Send,\n H: Send,",1,["tide_disco::route::MapErr"]],["impl<E> Send for SocketError<E>where\n E: Send,",1,["tide_disco::socket::SocketError"]],["impl<ToClient: ?Sized, FromClient, Error> Send for Connection<ToClient, FromClient, Error>",1,["tide_disco::socket::Connection"]],["impl Send for StatusCode",1,["tide_disco::status::StatusCode"]],["impl Send for OutOfRangeError",1,["tide_disco::status::OutOfRangeError"]],["impl Send for DiscoArgs",1,["tide_disco::DiscoArgs"]],["impl Send for DiscoKey",1,["tide_disco::DiscoKey"]],["impl Send for HealthStatus",1,["tide_disco::HealthStatus"]],["impl<AppState> Send for ServerState<AppState>where\n AppState: Send,",1,["tide_disco::ServerState"]],["impl Send for UrlSegment",1,["tide_disco::UrlSegment"]]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/marker/trait.StructuralEq.js b/implementors/core/marker/trait.StructuralEq.js
index ffa287ed..6781f95c 100644
--- a/implementors/core/marker/trait.StructuralEq.js
+++ b/implementors/core/marker/trait.StructuralEq.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"tide_disco":[["impl StructuralEq for RequestParamType"],["impl StructuralEq for HealthStatus"],["impl StructuralEq for AppHealth"],["impl StructuralEq for ServerError"],["impl StructuralEq for AppVersion"],["impl StructuralEq for Method"],["impl StructuralEq for RequestParamValue"],["impl StructuralEq for ApiVersion"]]
+"tide_disco":[["impl StructuralEq for ServerError"],["impl StructuralEq for RequestParamValue"],["impl StructuralEq for AppVersion"],["impl StructuralEq for RequestParamType"],["impl StructuralEq for ApiVersion"],["impl StructuralEq for Method"],["impl StructuralEq for StatusCode"],["impl StructuralEq for HealthStatus"],["impl StructuralEq for AppHealth"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/marker/trait.StructuralPartialEq.js b/implementors/core/marker/trait.StructuralPartialEq.js
index 43528493..74275cf1 100644
--- a/implementors/core/marker/trait.StructuralPartialEq.js
+++ b/implementors/core/marker/trait.StructuralPartialEq.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"tide_disco":[["impl StructuralPartialEq for RequestParamValue"],["impl StructuralPartialEq for AppHealth"],["impl StructuralPartialEq for AppVersion"],["impl StructuralPartialEq for Method"],["impl StructuralPartialEq for ServerError"],["impl StructuralPartialEq for HealthStatus"],["impl StructuralPartialEq for RequestParamType"],["impl StructuralPartialEq for ApiVersion"]]
+"tide_disco":[["impl StructuralPartialEq for AppHealth"],["impl StructuralPartialEq for AppVersion"],["impl StructuralPartialEq for HealthStatus"],["impl StructuralPartialEq for ServerError"],["impl StructuralPartialEq for RequestParamValue"],["impl StructuralPartialEq for Method"],["impl StructuralPartialEq for RequestParamType"],["impl StructuralPartialEq for StatusCode"],["impl StructuralPartialEq for ApiVersion"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/marker/trait.Sync.js b/implementors/core/marker/trait.Sync.js
index e128ec09..26f7cf49 100644
--- a/implementors/core/marker/trait.Sync.js
+++ b/implementors/core/marker/trait.Sync.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"tide_disco":[["impl Sync for ApiError",1,["tide_disco::api::ApiError"]],["impl Sync for ApiVersion",1,["tide_disco::api::ApiVersion"]],["impl Sync for ApiMetadata",1,["tide_disco::api::ApiMetadata"]],["impl<State, Error> Sync for Api<State, Error>",1,["tide_disco::api::Api"]],["impl<'a, State, Error> Sync for RoutesWithPath<'a, State, Error>",1,["tide_disco::api::RoutesWithPath"]],["impl<State, Error> Sync for App<State, Error>where\n State: Send + Sync,",1,["tide_disco::app::App"]],["impl Sync for AppError",1,["tide_disco::app::AppError"]],["impl Sync for AppHealth",1,["tide_disco::app::AppHealth"]],["impl Sync for AppVersion",1,["tide_disco::app::AppVersion"]],["impl<'a, State, Error, ModuleError> Sync for Module<'a, State, Error, ModuleError>",1,["tide_disco::app::Module"]],["impl Sync for ServerError",1,["tide_disco::error::ServerError"]],["impl Sync for HealthStatus",1,["tide_disco::healthcheck::HealthStatus"]],["impl Sync for Method",1,["tide_disco::method::Method"]],["impl Sync for ParseMethodError",1,["tide_disco::method::ParseMethodError"]],["impl Sync for RequestError",1,["tide_disco::request::RequestError"]],["impl Sync for RequestParams",1,["tide_disco::request::RequestParams"]],["impl Sync for RequestParamValue",1,["tide_disco::request::RequestParamValue"]],["impl Sync for RequestParamType",1,["tide_disco::request::RequestParamType"]],["impl Sync for RequestParam",1,["tide_disco::request::RequestParam"]],["impl<E> Sync for RouteError<E>where\n E: Sync,",1,["tide_disco::route::RouteError"]],["impl<State, Error> Sync for Route<State, Error>",1,["tide_disco::route::Route"]],["impl Sync for RouteParseError",1,["tide_disco::route::RouteParseError"]],["impl<H, F, E> Sync for MapErr<H, F, E>where\n E: Sync,\n F: Sync,\n H: Sync,",1,["tide_disco::route::MapErr"]],["impl<E> Sync for SocketError<E>where\n E: Sync,",1,["tide_disco::socket::SocketError"]],["impl<ToClient, FromClient, Error> !Sync for Connection<ToClient, FromClient, Error>",1,["tide_disco::socket::Connection"]],["impl Sync for DiscoArgs",1,["tide_disco::DiscoArgs"]],["impl Sync for DiscoKey",1,["tide_disco::DiscoKey"]],["impl Sync for HealthStatus",1,["tide_disco::HealthStatus"]],["impl<AppState> Sync for ServerState<AppState>where\n AppState: Sync,",1,["tide_disco::ServerState"]],["impl Sync for UrlSegment",1,["tide_disco::UrlSegment"]]]
+"tide_disco":[["impl Sync for ApiError",1,["tide_disco::api::ApiError"]],["impl Sync for ApiVersion",1,["tide_disco::api::ApiVersion"]],["impl Sync for ApiMetadata",1,["tide_disco::api::ApiMetadata"]],["impl<State, Error> Sync for Api<State, Error>",1,["tide_disco::api::Api"]],["impl<'a, State, Error> Sync for RoutesWithPath<'a, State, Error>",1,["tide_disco::api::RoutesWithPath"]],["impl<State, Error> Sync for App<State, Error>where\n State: Send + Sync,",1,["tide_disco::app::App"]],["impl Sync for AppError",1,["tide_disco::app::AppError"]],["impl Sync for AppHealth",1,["tide_disco::app::AppHealth"]],["impl Sync for AppVersion",1,["tide_disco::app::AppVersion"]],["impl<'a, State, Error, ModuleError> Sync for Module<'a, State, Error, ModuleError>",1,["tide_disco::app::Module"]],["impl Sync for ServerError",1,["tide_disco::error::ServerError"]],["impl Sync for HealthStatus",1,["tide_disco::healthcheck::HealthStatus"]],["impl Sync for Method",1,["tide_disco::method::Method"]],["impl Sync for ParseMethodError",1,["tide_disco::method::ParseMethodError"]],["impl Sync for RequestError",1,["tide_disco::request::RequestError"]],["impl Sync for RequestParams",1,["tide_disco::request::RequestParams"]],["impl Sync for RequestParamValue",1,["tide_disco::request::RequestParamValue"]],["impl Sync for RequestParamType",1,["tide_disco::request::RequestParamType"]],["impl Sync for RequestParam",1,["tide_disco::request::RequestParam"]],["impl<E> Sync for RouteError<E>where\n E: Sync,",1,["tide_disco::route::RouteError"]],["impl<State, Error> Sync for Route<State, Error>",1,["tide_disco::route::Route"]],["impl Sync for RouteParseError",1,["tide_disco::route::RouteParseError"]],["impl<H, F, E> Sync for MapErr<H, F, E>where\n E: Sync,\n F: Sync,\n H: Sync,",1,["tide_disco::route::MapErr"]],["impl<E> Sync for SocketError<E>where\n E: Sync,",1,["tide_disco::socket::SocketError"]],["impl<ToClient, FromClient, Error> !Sync for Connection<ToClient, FromClient, Error>",1,["tide_disco::socket::Connection"]],["impl Sync for StatusCode",1,["tide_disco::status::StatusCode"]],["impl Sync for OutOfRangeError",1,["tide_disco::status::OutOfRangeError"]],["impl Sync for DiscoArgs",1,["tide_disco::DiscoArgs"]],["impl Sync for DiscoKey",1,["tide_disco::DiscoKey"]],["impl Sync for HealthStatus",1,["tide_disco::HealthStatus"]],["impl<AppState> Sync for ServerState<AppState>where\n AppState: Sync,",1,["tide_disco::ServerState"]],["impl Sync for UrlSegment",1,["tide_disco::UrlSegment"]]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/marker/trait.Unpin.js b/implementors/core/marker/trait.Unpin.js
index 1f30141b..08b92143 100644
--- a/implementors/core/marker/trait.Unpin.js
+++ b/implementors/core/marker/trait.Unpin.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"tide_disco":[["impl Unpin for ApiError",1,["tide_disco::api::ApiError"]],["impl Unpin for ApiVersion",1,["tide_disco::api::ApiVersion"]],["impl Unpin for ApiMetadata",1,["tide_disco::api::ApiMetadata"]],["impl<State, Error> Unpin for Api<State, Error>",1,["tide_disco::api::Api"]],["impl<'a, State, Error> Unpin for RoutesWithPath<'a, State, Error>",1,["tide_disco::api::RoutesWithPath"]],["impl<State, Error> Unpin for App<State, Error>",1,["tide_disco::app::App"]],["impl Unpin for AppError",1,["tide_disco::app::AppError"]],["impl Unpin for AppHealth",1,["tide_disco::app::AppHealth"]],["impl Unpin for AppVersion",1,["tide_disco::app::AppVersion"]],["impl<'a, State, Error, ModuleError> Unpin for Module<'a, State, Error, ModuleError>",1,["tide_disco::app::Module"]],["impl Unpin for ServerError",1,["tide_disco::error::ServerError"]],["impl Unpin for HealthStatus",1,["tide_disco::healthcheck::HealthStatus"]],["impl Unpin for Method",1,["tide_disco::method::Method"]],["impl Unpin for ParseMethodError",1,["tide_disco::method::ParseMethodError"]],["impl Unpin for RequestError",1,["tide_disco::request::RequestError"]],["impl Unpin for RequestParams",1,["tide_disco::request::RequestParams"]],["impl Unpin for RequestParamValue",1,["tide_disco::request::RequestParamValue"]],["impl Unpin for RequestParamType",1,["tide_disco::request::RequestParamType"]],["impl Unpin for RequestParam",1,["tide_disco::request::RequestParam"]],["impl<E> Unpin for RouteError<E>where\n E: Unpin,",1,["tide_disco::route::RouteError"]],["impl<State, Error> Unpin for Route<State, Error>",1,["tide_disco::route::Route"]],["impl Unpin for RouteParseError",1,["tide_disco::route::RouteParseError"]],["impl<H, F, E> Unpin for MapErr<H, F, E>where\n E: Unpin,\n F: Unpin,\n H: Unpin,",1,["tide_disco::route::MapErr"]],["impl<E> Unpin for SocketError<E>where\n E: Unpin,",1,["tide_disco::socket::SocketError"]],["impl<ToClient: ?Sized, FromClient, Error> Unpin for Connection<ToClient, FromClient, Error>",1,["tide_disco::socket::Connection"]],["impl Unpin for DiscoArgs",1,["tide_disco::DiscoArgs"]],["impl Unpin for DiscoKey",1,["tide_disco::DiscoKey"]],["impl Unpin for HealthStatus",1,["tide_disco::HealthStatus"]],["impl<AppState> Unpin for ServerState<AppState>where\n AppState: Unpin,",1,["tide_disco::ServerState"]],["impl Unpin for UrlSegment",1,["tide_disco::UrlSegment"]]]
+"tide_disco":[["impl Unpin for ApiError",1,["tide_disco::api::ApiError"]],["impl Unpin for ApiVersion",1,["tide_disco::api::ApiVersion"]],["impl Unpin for ApiMetadata",1,["tide_disco::api::ApiMetadata"]],["impl<State, Error> Unpin for Api<State, Error>",1,["tide_disco::api::Api"]],["impl<'a, State, Error> Unpin for RoutesWithPath<'a, State, Error>",1,["tide_disco::api::RoutesWithPath"]],["impl<State, Error> Unpin for App<State, Error>",1,["tide_disco::app::App"]],["impl Unpin for AppError",1,["tide_disco::app::AppError"]],["impl Unpin for AppHealth",1,["tide_disco::app::AppHealth"]],["impl Unpin for AppVersion",1,["tide_disco::app::AppVersion"]],["impl<'a, State, Error, ModuleError> Unpin for Module<'a, State, Error, ModuleError>",1,["tide_disco::app::Module"]],["impl Unpin for ServerError",1,["tide_disco::error::ServerError"]],["impl Unpin for HealthStatus",1,["tide_disco::healthcheck::HealthStatus"]],["impl Unpin for Method",1,["tide_disco::method::Method"]],["impl Unpin for ParseMethodError",1,["tide_disco::method::ParseMethodError"]],["impl Unpin for RequestError",1,["tide_disco::request::RequestError"]],["impl Unpin for RequestParams",1,["tide_disco::request::RequestParams"]],["impl Unpin for RequestParamValue",1,["tide_disco::request::RequestParamValue"]],["impl Unpin for RequestParamType",1,["tide_disco::request::RequestParamType"]],["impl Unpin for RequestParam",1,["tide_disco::request::RequestParam"]],["impl<E> Unpin for RouteError<E>where\n E: Unpin,",1,["tide_disco::route::RouteError"]],["impl<State, Error> Unpin for Route<State, Error>",1,["tide_disco::route::Route"]],["impl Unpin for RouteParseError",1,["tide_disco::route::RouteParseError"]],["impl<H, F, E> Unpin for MapErr<H, F, E>where\n E: Unpin,\n F: Unpin,\n H: Unpin,",1,["tide_disco::route::MapErr"]],["impl<E> Unpin for SocketError<E>where\n E: Unpin,",1,["tide_disco::socket::SocketError"]],["impl<ToClient: ?Sized, FromClient, Error> Unpin for Connection<ToClient, FromClient, Error>",1,["tide_disco::socket::Connection"]],["impl Unpin for StatusCode",1,["tide_disco::status::StatusCode"]],["impl Unpin for OutOfRangeError",1,["tide_disco::status::OutOfRangeError"]],["impl Unpin for DiscoArgs",1,["tide_disco::DiscoArgs"]],["impl Unpin for DiscoKey",1,["tide_disco::DiscoKey"]],["impl Unpin for HealthStatus",1,["tide_disco::HealthStatus"]],["impl<AppState> Unpin for ServerState<AppState>where\n AppState: Unpin,",1,["tide_disco::ServerState"]],["impl Unpin for UrlSegment",1,["tide_disco::UrlSegment"]]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js b/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js
index c441edbf..80214b8b 100644
--- a/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js
+++ b/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"tide_disco":[["impl RefUnwindSafe for ApiError",1,["tide_disco::api::ApiError"]],["impl RefUnwindSafe for ApiVersion",1,["tide_disco::api::ApiVersion"]],["impl RefUnwindSafe for ApiMetadata",1,["tide_disco::api::ApiMetadata"]],["impl<State, Error> !RefUnwindSafe for Api<State, Error>",1,["tide_disco::api::Api"]],["impl<'a, State, Error> !RefUnwindSafe for RoutesWithPath<'a, State, Error>",1,["tide_disco::api::RoutesWithPath"]],["impl<State, Error> !RefUnwindSafe for App<State, Error>",1,["tide_disco::app::App"]],["impl RefUnwindSafe for AppError",1,["tide_disco::app::AppError"]],["impl RefUnwindSafe for AppHealth",1,["tide_disco::app::AppHealth"]],["impl RefUnwindSafe for AppVersion",1,["tide_disco::app::AppVersion"]],["impl<'a, State, Error, ModuleError> !RefUnwindSafe for Module<'a, State, Error, ModuleError>",1,["tide_disco::app::Module"]],["impl RefUnwindSafe for ServerError",1,["tide_disco::error::ServerError"]],["impl RefUnwindSafe for HealthStatus",1,["tide_disco::healthcheck::HealthStatus"]],["impl RefUnwindSafe for Method",1,["tide_disco::method::Method"]],["impl RefUnwindSafe for ParseMethodError",1,["tide_disco::method::ParseMethodError"]],["impl RefUnwindSafe for RequestError",1,["tide_disco::request::RequestError"]],["impl !RefUnwindSafe for RequestParams",1,["tide_disco::request::RequestParams"]],["impl RefUnwindSafe for RequestParamValue",1,["tide_disco::request::RequestParamValue"]],["impl RefUnwindSafe for RequestParamType",1,["tide_disco::request::RequestParamType"]],["impl RefUnwindSafe for RequestParam",1,["tide_disco::request::RequestParam"]],["impl<E> !RefUnwindSafe for RouteError<E>",1,["tide_disco::route::RouteError"]],["impl<State, Error> !RefUnwindSafe for Route<State, Error>",1,["tide_disco::route::Route"]],["impl RefUnwindSafe for RouteParseError",1,["tide_disco::route::RouteParseError"]],["impl<H, F, E> RefUnwindSafe for MapErr<H, F, E>where\n E: RefUnwindSafe,\n F: RefUnwindSafe,\n H: RefUnwindSafe,",1,["tide_disco::route::MapErr"]],["impl<E> !RefUnwindSafe for SocketError<E>",1,["tide_disco::socket::SocketError"]],["impl<ToClient, FromClient, Error> !RefUnwindSafe for Connection<ToClient, FromClient, Error>",1,["tide_disco::socket::Connection"]],["impl RefUnwindSafe for DiscoArgs",1,["tide_disco::DiscoArgs"]],["impl RefUnwindSafe for DiscoKey",1,["tide_disco::DiscoKey"]],["impl RefUnwindSafe for HealthStatus",1,["tide_disco::HealthStatus"]],["impl<AppState> !RefUnwindSafe for ServerState<AppState>",1,["tide_disco::ServerState"]],["impl RefUnwindSafe for UrlSegment",1,["tide_disco::UrlSegment"]]]
+"tide_disco":[["impl RefUnwindSafe for ApiError",1,["tide_disco::api::ApiError"]],["impl RefUnwindSafe for ApiVersion",1,["tide_disco::api::ApiVersion"]],["impl RefUnwindSafe for ApiMetadata",1,["tide_disco::api::ApiMetadata"]],["impl<State, Error> !RefUnwindSafe for Api<State, Error>",1,["tide_disco::api::Api"]],["impl<'a, State, Error> !RefUnwindSafe for RoutesWithPath<'a, State, Error>",1,["tide_disco::api::RoutesWithPath"]],["impl<State, Error> !RefUnwindSafe for App<State, Error>",1,["tide_disco::app::App"]],["impl RefUnwindSafe for AppError",1,["tide_disco::app::AppError"]],["impl RefUnwindSafe for AppHealth",1,["tide_disco::app::AppHealth"]],["impl RefUnwindSafe for AppVersion",1,["tide_disco::app::AppVersion"]],["impl<'a, State, Error, ModuleError> !RefUnwindSafe for Module<'a, State, Error, ModuleError>",1,["tide_disco::app::Module"]],["impl RefUnwindSafe for ServerError",1,["tide_disco::error::ServerError"]],["impl RefUnwindSafe for HealthStatus",1,["tide_disco::healthcheck::HealthStatus"]],["impl RefUnwindSafe for Method",1,["tide_disco::method::Method"]],["impl RefUnwindSafe for ParseMethodError",1,["tide_disco::method::ParseMethodError"]],["impl RefUnwindSafe for RequestError",1,["tide_disco::request::RequestError"]],["impl !RefUnwindSafe for RequestParams",1,["tide_disco::request::RequestParams"]],["impl RefUnwindSafe for RequestParamValue",1,["tide_disco::request::RequestParamValue"]],["impl RefUnwindSafe for RequestParamType",1,["tide_disco::request::RequestParamType"]],["impl RefUnwindSafe for RequestParam",1,["tide_disco::request::RequestParam"]],["impl<E> !RefUnwindSafe for RouteError<E>",1,["tide_disco::route::RouteError"]],["impl<State, Error> !RefUnwindSafe for Route<State, Error>",1,["tide_disco::route::Route"]],["impl RefUnwindSafe for RouteParseError",1,["tide_disco::route::RouteParseError"]],["impl<H, F, E> RefUnwindSafe for MapErr<H, F, E>where\n E: RefUnwindSafe,\n F: RefUnwindSafe,\n H: RefUnwindSafe,",1,["tide_disco::route::MapErr"]],["impl<E> !RefUnwindSafe for SocketError<E>",1,["tide_disco::socket::SocketError"]],["impl<ToClient, FromClient, Error> !RefUnwindSafe for Connection<ToClient, FromClient, Error>",1,["tide_disco::socket::Connection"]],["impl RefUnwindSafe for StatusCode",1,["tide_disco::status::StatusCode"]],["impl RefUnwindSafe for OutOfRangeError",1,["tide_disco::status::OutOfRangeError"]],["impl RefUnwindSafe for DiscoArgs",1,["tide_disco::DiscoArgs"]],["impl RefUnwindSafe for DiscoKey",1,["tide_disco::DiscoKey"]],["impl RefUnwindSafe for HealthStatus",1,["tide_disco::HealthStatus"]],["impl<AppState> !RefUnwindSafe for ServerState<AppState>",1,["tide_disco::ServerState"]],["impl RefUnwindSafe for UrlSegment",1,["tide_disco::UrlSegment"]]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/core/panic/unwind_safe/trait.UnwindSafe.js b/implementors/core/panic/unwind_safe/trait.UnwindSafe.js
index 1d6d4403..3dacd6c4 100644
--- a/implementors/core/panic/unwind_safe/trait.UnwindSafe.js
+++ b/implementors/core/panic/unwind_safe/trait.UnwindSafe.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"tide_disco":[["impl UnwindSafe for ApiError",1,["tide_disco::api::ApiError"]],["impl UnwindSafe for ApiVersion",1,["tide_disco::api::ApiVersion"]],["impl UnwindSafe for ApiMetadata",1,["tide_disco::api::ApiMetadata"]],["impl<State, Error> !UnwindSafe for Api<State, Error>",1,["tide_disco::api::Api"]],["impl<'a, State, Error> !UnwindSafe for RoutesWithPath<'a, State, Error>",1,["tide_disco::api::RoutesWithPath"]],["impl<State, Error> !UnwindSafe for App<State, Error>",1,["tide_disco::app::App"]],["impl UnwindSafe for AppError",1,["tide_disco::app::AppError"]],["impl UnwindSafe for AppHealth",1,["tide_disco::app::AppHealth"]],["impl UnwindSafe for AppVersion",1,["tide_disco::app::AppVersion"]],["impl<'a, State, Error, ModuleError> !UnwindSafe for Module<'a, State, Error, ModuleError>",1,["tide_disco::app::Module"]],["impl UnwindSafe for ServerError",1,["tide_disco::error::ServerError"]],["impl UnwindSafe for HealthStatus",1,["tide_disco::healthcheck::HealthStatus"]],["impl UnwindSafe for Method",1,["tide_disco::method::Method"]],["impl UnwindSafe for ParseMethodError",1,["tide_disco::method::ParseMethodError"]],["impl UnwindSafe for RequestError",1,["tide_disco::request::RequestError"]],["impl !UnwindSafe for RequestParams",1,["tide_disco::request::RequestParams"]],["impl UnwindSafe for RequestParamValue",1,["tide_disco::request::RequestParamValue"]],["impl UnwindSafe for RequestParamType",1,["tide_disco::request::RequestParamType"]],["impl UnwindSafe for RequestParam",1,["tide_disco::request::RequestParam"]],["impl<E> !UnwindSafe for RouteError<E>",1,["tide_disco::route::RouteError"]],["impl<State, Error> !UnwindSafe for Route<State, Error>",1,["tide_disco::route::Route"]],["impl UnwindSafe for RouteParseError",1,["tide_disco::route::RouteParseError"]],["impl<H, F, E> UnwindSafe for MapErr<H, F, E>where\n E: UnwindSafe,\n F: UnwindSafe,\n H: UnwindSafe,",1,["tide_disco::route::MapErr"]],["impl<E> !UnwindSafe for SocketError<E>",1,["tide_disco::socket::SocketError"]],["impl<ToClient, FromClient, Error> !UnwindSafe for Connection<ToClient, FromClient, Error>",1,["tide_disco::socket::Connection"]],["impl UnwindSafe for DiscoArgs",1,["tide_disco::DiscoArgs"]],["impl UnwindSafe for DiscoKey",1,["tide_disco::DiscoKey"]],["impl UnwindSafe for HealthStatus",1,["tide_disco::HealthStatus"]],["impl<AppState> !UnwindSafe for ServerState<AppState>",1,["tide_disco::ServerState"]],["impl UnwindSafe for UrlSegment",1,["tide_disco::UrlSegment"]]]
+"tide_disco":[["impl UnwindSafe for ApiError",1,["tide_disco::api::ApiError"]],["impl UnwindSafe for ApiVersion",1,["tide_disco::api::ApiVersion"]],["impl UnwindSafe for ApiMetadata",1,["tide_disco::api::ApiMetadata"]],["impl<State, Error> !UnwindSafe for Api<State, Error>",1,["tide_disco::api::Api"]],["impl<'a, State, Error> !UnwindSafe for RoutesWithPath<'a, State, Error>",1,["tide_disco::api::RoutesWithPath"]],["impl<State, Error> !UnwindSafe for App<State, Error>",1,["tide_disco::app::App"]],["impl UnwindSafe for AppError",1,["tide_disco::app::AppError"]],["impl UnwindSafe for AppHealth",1,["tide_disco::app::AppHealth"]],["impl UnwindSafe for AppVersion",1,["tide_disco::app::AppVersion"]],["impl<'a, State, Error, ModuleError> !UnwindSafe for Module<'a, State, Error, ModuleError>",1,["tide_disco::app::Module"]],["impl UnwindSafe for ServerError",1,["tide_disco::error::ServerError"]],["impl UnwindSafe for HealthStatus",1,["tide_disco::healthcheck::HealthStatus"]],["impl UnwindSafe for Method",1,["tide_disco::method::Method"]],["impl UnwindSafe for ParseMethodError",1,["tide_disco::method::ParseMethodError"]],["impl UnwindSafe for RequestError",1,["tide_disco::request::RequestError"]],["impl !UnwindSafe for RequestParams",1,["tide_disco::request::RequestParams"]],["impl UnwindSafe for RequestParamValue",1,["tide_disco::request::RequestParamValue"]],["impl UnwindSafe for RequestParamType",1,["tide_disco::request::RequestParamType"]],["impl UnwindSafe for RequestParam",1,["tide_disco::request::RequestParam"]],["impl<E> !UnwindSafe for RouteError<E>",1,["tide_disco::route::RouteError"]],["impl<State, Error> !UnwindSafe for Route<State, Error>",1,["tide_disco::route::Route"]],["impl UnwindSafe for RouteParseError",1,["tide_disco::route::RouteParseError"]],["impl<H, F, E> UnwindSafe for MapErr<H, F, E>where\n E: UnwindSafe,\n F: UnwindSafe,\n H: UnwindSafe,",1,["tide_disco::route::MapErr"]],["impl<E> !UnwindSafe for SocketError<E>",1,["tide_disco::socket::SocketError"]],["impl<ToClient, FromClient, Error> !UnwindSafe for Connection<ToClient, FromClient, Error>",1,["tide_disco::socket::Connection"]],["impl UnwindSafe for StatusCode",1,["tide_disco::status::StatusCode"]],["impl UnwindSafe for OutOfRangeError",1,["tide_disco::status::OutOfRangeError"]],["impl UnwindSafe for DiscoArgs",1,["tide_disco::DiscoArgs"]],["impl UnwindSafe for DiscoKey",1,["tide_disco::DiscoKey"]],["impl UnwindSafe for HealthStatus",1,["tide_disco::HealthStatus"]],["impl<AppState> !UnwindSafe for ServerState<AppState>",1,["tide_disco::ServerState"]],["impl UnwindSafe for UrlSegment",1,["tide_disco::UrlSegment"]]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/num_traits/cast/trait.FromPrimitive.js b/implementors/num_traits/cast/trait.FromPrimitive.js
new file mode 100644
index 00000000..b6bf0c1c
--- /dev/null
+++ b/implementors/num_traits/cast/trait.FromPrimitive.js
@@ -0,0 +1,3 @@
+(function() {var implementors = {
+"tide_disco":[["impl FromPrimitive for StatusCode"]]
+};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/serde/de/trait.Deserialize.js b/implementors/serde/de/trait.Deserialize.js
index 35602ee5..52b36299 100644
--- a/implementors/serde/de/trait.Deserialize.js
+++ b/implementors/serde/de/trait.Deserialize.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"tide_disco":[["impl<'de> Deserialize<'de> for ServerError"],["impl<'de> Deserialize<'de> for RequestError"],["impl<'de> Deserialize<'de> for ApiVersion"],["impl<'de> Deserialize<'de> for AppVersion"],["impl<'de> Deserialize<'de> for AppHealth"],["impl<'de> Deserialize<'de> for HealthStatus"],["impl<'de> Deserialize<'de> for HealthStatus"],["impl<'de> Deserialize<'de> for RequestParamType"],["impl<'de> Deserialize<'de> for ApiMetadata"]]
+"tide_disco":[["impl<'de> Deserialize<'de> for HealthStatus"],["impl<'de> Deserialize<'de> for RequestParamType"],["impl<'de> Deserialize<'de> for ApiVersion"],["impl<'de> Deserialize<'de> for AppVersion"],["impl<'de> Deserialize<'de> for RequestError"],["impl<'de> Deserialize<'de> for AppHealth"],["impl<'de> Deserialize<'de> for ServerError"],["impl<'de> Deserialize<'de> for StatusCode"],["impl<'de> Deserialize<'de> for ApiMetadata"],["impl<'de> Deserialize<'de> for HealthStatus"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/serde/ser/trait.Serialize.js b/implementors/serde/ser/trait.Serialize.js
index d30366b5..5e8fa63e 100644
--- a/implementors/serde/ser/trait.Serialize.js
+++ b/implementors/serde/ser/trait.Serialize.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"tide_disco":[["impl Serialize for AppVersion"],["impl Serialize for HealthStatus"],["impl Serialize for AppHealth"],["impl Serialize for ApiMetadata"],["impl Serialize for ApiVersion"],["impl Serialize for RequestParamType"],["impl Serialize for RequestError"],["impl Serialize for ServerError"]]
+"tide_disco":[["impl Serialize for ApiVersion"],["impl Serialize for AppVersion"],["impl Serialize for AppHealth"],["impl Serialize for HealthStatus"],["impl Serialize for RequestError"],["impl Serialize for ServerError"],["impl Serialize for StatusCode"],["impl Serialize for RequestParamType"],["impl Serialize for ApiMetadata"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/implementors/snafu/trait.ErrorCompat.js b/implementors/snafu/trait.ErrorCompat.js
index 7bef218e..fb567999 100644
--- a/implementors/snafu/trait.ErrorCompat.js
+++ b/implementors/snafu/trait.ErrorCompat.js
@@ -1,3 +1,3 @@
(function() {var implementors = {
-"tide_disco":[["impl ErrorCompat for ApiError"],["impl ErrorCompat for ServerError"],["impl ErrorCompat for RequestError"],["impl ErrorCompat for RouteParseError"],["impl ErrorCompat for AppError"]]
+"tide_disco":[["impl ErrorCompat for AppError"],["impl ErrorCompat for ServerError"],["impl ErrorCompat for RequestError"],["impl ErrorCompat for ApiError"],["impl ErrorCompat for OutOfRangeError"],["impl ErrorCompat for RouteParseError"]]
};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})()
\ No newline at end of file
diff --git a/search-index.js b/search-index.js
index 4ec61ea8..5dbf742b 100644
--- a/search-index.js
+++ b/search-index.js
@@ -1,5 +1,5 @@
var searchIndex = JSON.parse('{\
-"tide_disco":{"doc":"Tide Disco is a web server framework with built-in …","t":"NCCGGNNNNNNNNNNDENCNNNNNNNENGNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNCNCCCCNNNRRNDNNENNNNNNNNNNNNNNDENMNAMNAFMMNLLLLLLLMNLLLLLLLLLLLLLLLLFLLLLLLLLLLLLFFFLLLLNLLLLLLLLLLALLLLLLLLLLLLLLLLLLLLLLLFLLLLLLLMMAFLLCLLLLFLLLLLLLLLLLLLLLLLLLFLAALLFLLLLLLLLLLLLLAAMMLLLLLLLLLLLLLALLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLFNDEDNDNNNNNNNNNDNMLLLLLLLLLLLLLLLLLLLLLLLLMLLLLLLLLLLLLMLLLLLLLMMMMLMMLLLLLLLLLLLMLLMMMMLLMLLLLLMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMNDEDDIQDNIKMLLKLLLLLLLLLLLLLLLLLLLLLLMLLLLLLLLLLLLLLLLLLLKLLLLLLLMMLLLLLLMKLLLLLLLLLLLLLLLLLLLLLLLLLLLMIDLLLLKLLLLLLLLLLLLLLLLLLLLLLLLLLMLLKLMLLLLLLNIENNNNNLLLLLLLLLLLLLLKLLLLLLNENDINQILLLLLLLLLLLLLLLLLLLLLLLLLKLLLLLLLLLLLKQIKNNNNNNNNNNNNNNNEDEEDNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMLLLLLLLLLMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMMMNNNNNNNNNNDNNNNNDENENNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMNNNDNNNENNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMM","n":["Accepted","Api","App","AppServerState","AppState","Array","Available","BadGateway","BadRequest","Boolean","Boolean","Conflict","Continue","Created","Datetime","DiscoArgs","DiscoKey","EarlyHints","Error","ExpectationFailed","FailedDependency","Float","Forbidden","Found","GatewayTimeout","Gone","HealthStatus","Hexadecimal","Html","HttpVersionNotSupported","ImATeapot","ImUsed","InsufficientStorage","Integer","Integer","InternalServerError","LengthRequired","Literal","Locked","LoopDetected","Method","MethodNotAllowed","MisdirectedRequest","MovedPermanently","MultiStatus","MultipleChoice","NetworkAuthenticationRequired","NoContent","NonAuthoritativeInformation","NotAcceptable","NotExtended","NotFound","NotImplemented","NotModified","Ok","PartialContent","PayloadTooLarge","PaymentRequired","PermanentRedirect","PreconditionFailed","PreconditionRequired","ProxyAuthenticationRequired","RequestError","RequestHeaderFieldsTooLarge","RequestParam","RequestParamType","RequestParamValue","RequestParams","RequestTimeout","RequestedRangeNotSatisfiable","ResetContent","SERVER_STARTUP_RETRIES","SERVER_STARTUP_SLEEP_MS","SeeOther","ServerState","ServiceUnavailable","Starting","StatusCode","Stopping","String","SwitchingProtocols","Table","TaggedBase64","TemporaryRedirect","TooEarly","TooManyRequests","Unauthorized","UnavailableForLegalReasons","UnprocessableEntity","UnsupportedMediaType","UpgradeRequired","UriTooLong","Url","UrlSegment","VariantAlsoNegotiates","ansi_color","ansi_color","api","api_toml","api_toml","app","app_api_path","app_state","app_state","app_toml","as_ref","as_ref","as_ref","as_str","augment_args","augment_args_for_update","authority","base_url","base_url","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","cannot_be_a_base","canonical_reason","check_api","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","compare","compose_config_path","compose_settings","configure_router","deserialize","deserialize","deserialize","deserialize_internal","disco_toml","domain","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","error","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fragment","from","from","from","from","from","from","from","from_arg_matches","from_arg_matches_mut","from_directory_path","from_file_path","from_str","from_str","get_api_path","get_hash","get_hash","group_id","has_authority","has_host","hash","hash","health_status","health_status","healthcheck","healthcheck","host","host_str","http","index","index","index","index","init_logging","into","into","into","into","into","into","into","into_client_request","into_client_request","into_resettable","into_string","is_bound","is_client_error","is_informational","is_redirection","is_server_error","is_special","is_success","join","load_api","make_relative","method","metrics","new","options","org_data_path","origin","parse","parse_with_params","partial_cmp","password","path","path_segments","path_segments_mut","port","port_or_known_default","query","query_pairs","query_pairs_mut","request","route","router","router","scheme","serialize","serialize","serialize_internal","set_fragment","set_host","set_ip_host","set_password","set_path","set_port","set_query","set_scheme","set_username","socket","socket_addrs","to_file_path","to_listener","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","update_from_arg_matches","update_from_arg_matches_mut","username","vzip","vzip","vzip","vzip","vzip","vzip","vzip","wait_for_server","AmbiguousRoutes","Api","ApiError","ApiMetadata","ApiMustBeTable","ApiVersion","CannotReadToml","HandlerAlreadyRegistered","IncorrectMethod","InvalidFormatVersion","InvalidMetaTable","MissingFormatVersion","MissingRoutesTable","Route","RoutesMustBeTable","RoutesWithPath","UndefinedRoute","api_version","as_error_source","at","backtrace","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","cause","clone","clone","clone","clone_into","clone_into","clone_into","default","delete","description","description","description","deserialize","deserialize","documentation","eq","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","format_version","from","from","from","from","from","from_file","get","heading_description","heading_entry","heading_parameters","heading_routes","health","html_bottom","html_top","index","into","into","into","into","into","into_iter","into_iter","into_iter","map_err","metrics","name","new","next","parameter_none","parameter_row","parameter_table_close","parameter_table_open","post","put","route_path","routes_by_path","serialize","serialize","socket","source","spec_version","stream","to_owned","to_owned","to_owned","to_string","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","version","vzip","vzip","vzip","vzip","vzip","with_health_check","with_public","with_version","actual","expected","reason","route1","route2","source","source","Api","App","AppError","AppHealth","AppVersion","Listener","Listener","Module","ModuleAlreadyExists","ToListener","accept","app_version","as_error_source","backtrace","bind","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","cause","clone","clone","clone","clone_into","clone_into","clone_into","deref","deref_mut","description","deserialize","deserialize","disco_version","drop","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","from","from","from","from","from","health","info","into","into","into","into","into","module","module_health","modules","modules","register_module","serialize","serialize","serve","source","status","status","to_listener","to_owned","to_owned","to_owned","to_string","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","version","vzip","vzip","vzip","vzip","vzip","with_state","with_version","source","Error","ServerError","as_error_source","backtrace","borrow","borrow_mut","catch_all","catch_all","cause","clone","clone_into","description","deserialize","eq","equivalent","equivalent","equivalent","fmt","fmt","from","from","from","from","from","from","from_config_error","from_io_error","from_request_error","from_route_error","from_server_error","from_socket_error","into","into_tide_error","message","serialize","source","status","status","status","to_owned","to_string","try_from","try_into","type_id","vzip","Available","HealthCheck","HealthStatus","Initializing","ShuttingDown","TemporarilyUnavailable","Unavailabale","Unhealthy","borrow","borrow_mut","clone","clone_into","default","deserialize","eq","equivalent","equivalent","equivalent","fmt","from","into","serialize","status","status","to_owned","try_from","try_into","type_id","vzip","Http","Method","Metrics","ParseMethodError","ReadState","Socket","State","WriteState","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","delete","eq","equivalent","equivalent","equivalent","fmt","fmt","from","from","from","from_str","get","into","into","is_http","is_mutable","metrics","post","put","read","socket","to_owned","to_string","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","write","Error","Metrics","export","Bincode","Boolean","Boolean","Hexadecimal","Hexadecimal","Http","IncorrectParamType","Integer","Integer","IntegerOverflow","InvalidParam","Json","Literal","Literal","MissingParam","RequestError","RequestParam","RequestParamType","RequestParamValue","RequestParams","TagMismatch","TaggedBase64","TaggedBase64","TaggedBase64","UnsupportedContentType","accept","as_blob","as_boolean","as_error_source","as_integer","as_string","as_tagged_base64","backtrace","blob_param","body_auto","body_bytes","body_json","boolean_param","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","cause","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","description","deserialize","deserialize","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from_str","headers","integer_param","into","into","into","into","into","method","name","new","opt_blob_param","opt_boolean_param","opt_integer_param","opt_param","opt_string_param","opt_tagged_base64_param","param","param_type","param_type","parse","remote","serialize","serialize","source","string_param","tagged_base64_param","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","actual","actual","expected","expected","expected","name","param_type","reason","reason","reason","value","AppSpecific","Bincode","ExportMetrics","IncorrectDocType","IncorrectMethod","IncorrectParamType","IncorrectPathType","InvalidMethod","InvalidTypeExpression","Json","MapErr","MethodMustBeString","MissingPath","MissingPathArray","PathElementError","Request","Route","RouteError","RouteMustBeTable","RouteParseError","Tide","UnrecognizedType","UnsupportedContentType","as_error_source","backtrace","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","cause","clone","clone_into","description","documentation","fmt","fmt","fmt","fmt","from","from","from","from","from","has_handler","into","into","into","into","map_app_specific","map_err","method","name","new","params","patterns","source","status","to_owned","to_string","to_string","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","expected","AppSpecific","Bincode","Closed","Connection","IncorrectMethod","Json","Request","SocketError","UnsupportedMessageType","WebSockets","borrow","borrow","borrow_mut","borrow_mut","code","drop","fmt","fmt","from","from","from","from","from","from","into","into","into_stream","map_app_specific","poll_close","poll_flush","poll_next","poll_ready","start_send","status","to_string","try_from","try_from","try_into","try_into","try_poll_next","type_id","type_id","vzip","vzip","actual","expected"],"q":[[0,"tide_disco"],[308,"tide_disco::api"],[434,"tide_disco::api::ApiError"],[441,"tide_disco::app"],[543,"tide_disco::app::AppError"],[544,"tide_disco::error"],[589,"tide_disco::healthcheck"],[618,"tide_disco::method"],[664,"tide_disco::metrics"],[667,"tide_disco::request"],[804,"tide_disco::request::RequestError"],[815,"tide_disco::route"],[895,"tide_disco::route::RouteError"],[896,"tide_disco::socket"],[940,"tide_disco::socket::SocketError"],[942,"std::path"],[943,"clap_builder::builder::command"],[944,"toml::value"],[945,"core::clone"],[946,"core::cmp"],[947,"config::config"],[948,"config::error"],[949,"core::result"],[950,"routefinder::router"],[951,"alloc::sync"],[952,"serde::de"],[953,"core::option"],[954,"core::fmt"],[955,"core::fmt"],[956,"clap_builder"],[957,"std::path"],[958,"url::parser"],[959,"core::hash"],[960,"core::marker"],[961,"core::hash"],[962,"core::hash"],[963,"tide::response"],[964,"http_types::error"],[965,"url::host"],[966,"core::ops::range"],[967,"url::slicing"],[968,"core::ops::range"],[969,"tungstenite::error"],[970,"alloc::string"],[971,"clap_builder::builder::resettable"],[972,"url"],[973,"url::origin"],[974,"core::iter::traits::collect"],[975,"core::str::iter"],[976,"url::path_segments"],[977,"form_urlencoded"],[978,"url"],[979,"core::net::ip_addr"],[980,"core::net::socket_addr"],[981,"alloc::alloc"],[982,"alloc::vec"],[983,"std::io::error"],[984,"core::ops::function"],[985,"core::any"],[986,"core::error"],[987,"core::marker"],[988,"core::convert"],[989,"core::fmt"],[990,"core::future::future"],[991,"alloc::boxed"],[992,"core::pin"],[993,"tide::server"],[994,"core::convert"],[995,"std::io::error"],[996,"core::ops::function"],[997,"tagged_base64"],[998,"core::convert"],[999,"tungstenite::protocol::frame::coding"],[1000,"core::fmt"],[1001,"serde_json::error"],[1002,"core::task::wake"],[1003,"core::task::poll"],[1004,"serde::ser"]],"d":["202 Accepted","","","","","Represents a TOML array","","502 Bad Gateway","400 Bad Request","Represents a TOML boolean","","409 Conflict","100 Continue","201 Created","Represents a TOML datetime","","Configuration keys for Tide Disco settings","103 Early Hints","","417 Expectation Failed","424 Failed Dependency","Represents a TOML float","403 Forbidden","302 Found","504 Gateway Timeout","410 Gone","","","","505 HTTP Version Not Supported","418 I’m a teapot","226 Im Used","507 Insufficient Storage","Represents a TOML integer","","500 Internal Server Error","411 Length Required","","423 Locked","508 Loop Detected","","405 Method Not Allowed","421 Misdirected Request","301 Moved Permanently","207 Multi-Status","300 Multiple Choice","511 Network Authentication Required","204 No Content","203 Non Authoritative Information","406 Not Acceptable","510 Not Extended","404 Not Found","501 Not Implemented","304 Not Modified","200 Ok","206 Partial Content","413 Payload Too Large","402 Payment Required","308 Permanent Redirect","412 Precondition Failed","428 Precondition Required","407 Proxy Authentication Required","","431 Request Header Fields Too Large","","","","","408 Request Timeout","416 Requested Range Not Satisfiable","205 Reset Content","Number of times to poll before failing","Number of milliseconds to sleep between attempts","303 See Other","","503 Service Unavailable","","HTTP response status codes.","","Represents a TOML string","101 Switching Protocols","Represents a TOML table","","307 Temporary Redirect","425 Too Early","429 Too Many Requests","401 Unauthorized","451 Unavailable For Legal Reasons","422 Unprocessable Entity","415 Unsupported Media Type","426 Upgrade Required","414 URI Too Long","A parsed URL record.","","506 Variant Also Negotiates","If true, log in color. Otherwise, no color.","","","HTTP routes","","","","","","","","","","Return the serialization of this URL.","","","Return the authority of this URL as an ASCII string.","Server address","","","","","","","","","","","","","","","","Return whether this URL is a cannot-be-a-base URL, meaning …","The canonical reason for a given status code","Check api.toml for schema compliance errors","","","","","","","","","","","","","Compose the path to the application’s configuration file","Get the application configuration","Add routes from api.toml to the routefinder instance in …","","","","Serialize with Serde using the internal representation of …","","If this URL has a host and it is a domain name (not an IP …","","","","","","","","","","","","","","","","","","","","Return this URL’s fragment identifier, if any.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","Convert a directory name as std::path::Path into an URL in …","Convert a file name as std::path::Path into an URL in the …","","","Get the path to api.toml","","","","Return whether the URL has an ‘authority’, which can …","Equivalent to url.host().is_some().","","","","","","Return a JSON expression with status 200 indicating the …","Return the parsed representation of the host for this URL. …","Return the string representation of the host (domain or IP …","","","","","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","Return the serialization of this URL.","","Returns true if the status code is the 4xx range.","Returns true if the status code is 1xx range.","Returns true if the status code is the 3xx range.","Returns true if the status code is the 5xx range.","Return whether the URL is special (has a special scheme)","Returns true if the status code is the 2xx range.","Parse a string as an URL, with this URL as the base URL.","Load the web API or panic","Creates a relative URL if possible, with this URL as the …","Interfaces for methods of accessing to state.","Support for routes using the Prometheus metrics format.","","Return a default ParseOptions that can fully configure the …","","Return the origin of this URL (…","Parse an absolute URL from a string.","Parse an absolute URL from a string and add params to its …","","Return the password for this URL, if any, as a …","Return the path for this URL, as a percent-encoded ASCII …","Unless this URL is cannot-be-a-base, return an iterator of …","Return an object with methods to manipulate this URL’s …","Return the port number for this URL, if any.","Return the port number for this URL, or the default port …","Return this URL’s query string, if any, as a …","Parse the URL’s query string, if any, as …","Manipulate this URL’s query string, viewed as a sequence …","","","","","Return the scheme of this URL, lower-cased, as an ASCII …","","","Serialize with Serde using the internal representation of …","Change this URL’s fragment identifier.","Change this URL’s host.","Change this URL’s host to the given IP address.","Change this URL’s password.","Change this URL’s path.","Change this URL’s port number.","Change this URL’s query string.","Change this URL’s scheme.","Change this URL’s username.","An interface for asynchronous communication with clients, …","Resolve a URL’s host and port number to SocketAddr.","Assuming the URL is in the file scheme or similar, convert …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Return the username for this URL (typically the empty …","","","","","","","","Wait for the server to respond to a connection request","","A description of an API.","An error encountered when parsing or constructing an Api.","Metadata used for describing and documenting an API.","","Version information about an API.","","","","","","","","","","Iterator for routes_by_path.","","The version of this API.","","Register a handler for a route.","","","","","","","","","","","","","","","","","","","","Register a handler for a DELETE route.","","The description of this API from the specification.","A description of this API.","","","Compose an HTML page documenting all the routes in this …","","","","","","","","","","The version of the Tide Disco API specification format.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Create an Api by reading a TOML specification from a file.","Register a handler for a GET route.","The heading preceding documentation of a route description.","The heading for documentation of a route.","The heading preceding documentation of route parameters.","The heading preceding documentation of all routes in this …","Check the health status of a server with the given state.","HTML to be appended to automatically generated …","HTML to be prepended to automatically generated …","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","Create a new Api which is just like this one, except has a …","Register a handler for a METRICS route.","The name of this API.","Parse an API from a TOML specification.","","Documentation to insert in the parameters section of a …","HTML formatting an entry in a table documenting the …","HTML closing a table documenting the parameters of a route.","HTML preceding the contents of a table documenting the …","Register a handler for a POST route.","Register a handler for a PUT route.","HTML formatting the path of a route.","Iterate over groups of routes with the same path.","","","Register a handler for a SOCKET route.","","The format version of the TOML specification used to load …","Register a uni-directional handler for a SOCKET route.","","","","","","","","","","","","","","","","","","","","Get the version of this API.","","","","","","Set the health check handler for this API.","Serve the contents of dir at the URL /public/{{NAME}}.","Set the API version.","","","","","","","","","A tide-disco server application.","An error encountered while building an App.","The health status of an application.","Version information about an application.","The Listener trait represents an implementation of http …","What listener are we converting into?","","","ToListener represents any type that can be converted into a","Start accepting incoming connections. This method must be …","The version of this application.","","","Bind the listener. This starts the listening process by …","","","","","","","","","","","","","","","","","","","","","","","The version of the Tide Disco server framework.","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Check the health of each registered module in response to …","Expose information about the connection. This should …","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Create and register an API module.","Check the health of the named module.","The status of each registered module.","The version of each module registered with this …","Register an API module.","","","Serve the App asynchronously.","","","The status of the overall application.","Transform self into a Listener. Unless self is already …","","","","","","","","","","","","","","","","","","","","Get the version of this application.","","","","","","Create a new App with a given state.","Set the application version.","","Errors which can be serialized in a response body.","The simplest possible implementation of Error.","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","","","","","","","","","","","Calls U::from(self).","","","","","","","","","","","","","","","A response to a healthcheck endpoint.","Common health statuses of an application.","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Calls U::from(self).","","The status of this health check.","","","","","","","","","","","A state which allows read access.","","The type of state which this type allows a caller to read.","A state which allows exclusive, write access.","","","","","","","The HTTP DELETE method.","","","","","","","Returns the argument unchanged.","","Returns the argument unchanged.","","The HTTP GET method.","Calls U::from(self).","Calls U::from(self).","Check if a method is a standard HTTP method.","Check if a request method implies mutable access to the …","The Tide Disco METRICS method.","The HTTP POST method.","The HTTP PUT method.","Do an operation with immutable access to the state.","The Tide Disco SOCKET method.","","","","","","","","","","","Do an operation with mutable access to the state.","","","","","","","","","","","","","","","","","","","","","","","Parameters passed to a route handler.","","","","","","The Accept header of this request.","","","","","","","","Get the value of a named parameter and convert it to a …","Deserialize the body of a request.","","","Get the value of a named parameter and convert it to a bool…","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","The headers of the incoming request.","Get the value of a named parameter and convert it to an …","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","The Method used to dispatch the request.","","Parse a parameter from a Request.","Get the value of a named optional parameter and convert it …","Get the value of a named optional parameter and convert it …","Get the value of a named optional parameter and convert it …","Get the value of a named optional parameter.","Get the value of a named optional parameter and convert it …","Get the value of a named optional parameter and convert it …","Get the value of a named parameter.","","","","Get the remote address for this request.","","","","Get the value of a named parameter and convert it to a …","Get the value of a named parameter and convert it to …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","All the information we need to parse, typecheck, and …","An error returned by a route handler.","","","","","","","","","","","","","","","","","","","","Compose an HTML fragment documenting all the variations on …","","","","","Returns the argument unchanged.","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Whether a non-default handler has been bound to this route.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","Create a new route with a modified error type.","The HTTP method of the route.","The name of the route.","Parse a Route from a TOML specification.","Get all formal parameters.","Iterate over route patterns.","","","","","","","","","","","","","","","","","","","","","","","","","","A connection facilitating bi-directional, asynchronous …","","","","An error returned by a socket handler.","","","","","","","","","","","Returns the argument unchanged.","","Returns the argument unchanged.","","","","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","",""],"i":[8,0,0,0,0,130,5,8,8,130,12,8,8,8,130,0,0,8,0,8,8,130,8,8,8,8,0,12,0,8,8,8,8,130,12,8,8,12,8,8,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,0,8,0,0,0,0,8,8,8,0,0,8,0,8,5,0,5,130,8,130,12,8,8,8,8,8,8,8,8,8,0,0,8,27,4,0,27,4,0,0,40,10,4,3,4,5,3,27,27,3,27,4,3,27,4,5,10,12,8,3,27,4,5,10,12,8,3,8,0,3,5,10,12,8,3,5,10,12,8,3,3,0,0,0,3,5,8,3,4,3,3,8,8,3,3,3,8,8,8,0,3,3,27,4,5,5,12,8,8,3,3,27,4,5,10,12,8,27,27,3,3,3,12,0,3,8,27,3,3,3,8,40,10,0,0,3,3,0,3,3,3,3,0,3,27,4,5,10,12,8,3,3,3,3,12,8,8,8,8,3,8,3,0,3,0,0,12,3,0,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,40,10,3,3,8,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,5,10,12,8,3,5,8,3,3,27,4,5,10,12,12,8,8,3,27,4,5,10,12,8,3,27,4,5,10,12,8,27,27,3,3,27,4,5,10,12,8,0,73,0,0,0,73,0,73,73,73,73,73,73,73,73,73,0,73,77,73,72,73,85,73,77,78,72,85,73,77,78,72,73,73,77,78,73,77,78,78,72,73,72,78,77,78,72,77,77,77,77,73,73,77,78,72,78,85,73,77,78,72,72,72,78,78,78,78,72,78,78,72,85,73,77,78,72,85,72,72,72,72,78,72,85,78,78,78,78,72,72,78,72,77,78,72,73,77,72,73,77,78,73,85,73,77,78,72,85,73,77,78,72,85,73,77,78,72,72,85,73,77,78,72,72,72,72,131,131,132,133,133,134,135,92,0,0,0,0,0,102,0,92,0,136,95,92,92,136,98,96,92,94,95,98,96,92,94,95,92,92,94,95,92,94,95,96,96,92,94,95,95,96,94,95,94,94,94,95,95,95,92,92,94,95,98,96,92,94,95,98,136,98,96,92,94,95,98,98,94,95,98,94,95,98,92,94,94,102,92,94,95,92,98,96,92,94,95,98,96,92,94,95,98,96,92,94,95,98,98,96,92,94,95,98,98,137,0,0,103,103,103,103,101,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,101,101,101,101,101,101,103,101,103,103,103,101,103,103,103,103,103,103,103,103,107,0,0,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,138,107,107,107,107,107,107,108,0,108,0,0,108,81,0,139,108,139,108,108,108,108,108,108,108,108,108,108,139,108,108,108,108,139,108,108,108,108,108,108,81,108,108,108,139,108,139,108,139,108,139,108,79,140,0,140,105,112,118,112,118,105,105,112,118,105,105,105,112,118,105,0,0,0,0,0,105,105,112,118,105,82,112,112,105,112,112,112,105,82,82,82,82,82,105,82,112,118,119,105,82,112,118,119,105,105,82,112,118,119,105,82,112,118,119,105,105,118,112,118,112,112,112,118,118,118,105,105,82,112,118,118,119,105,82,112,118,119,118,82,82,105,82,112,118,119,82,119,112,82,82,82,82,82,82,82,112,119,112,82,105,118,105,82,82,105,82,112,118,119,105,118,105,82,112,118,118,119,105,82,112,118,119,105,82,112,118,119,105,82,112,118,119,141,142,141,143,142,144,145,146,147,145,143,106,106,106,121,106,121,121,121,121,106,0,121,121,121,121,106,0,0,121,0,106,121,106,121,121,106,148,83,121,106,148,83,121,121,121,121,121,83,106,83,121,121,106,106,148,83,121,83,106,148,83,121,106,83,83,83,83,83,83,121,106,121,106,121,106,148,83,121,106,148,83,121,106,148,83,121,106,148,83,121,149,104,104,104,0,104,104,104,0,104,104,123,104,123,104,104,123,104,104,123,104,104,104,104,104,123,104,123,104,123,123,123,123,123,104,104,123,104,123,104,123,123,104,123,104,150,150],"f":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[1,1],2],0,0,0,[3,1],[4,1],[5,1],[3,1],[6,6],[6,6],[3,1],0,0,[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[3,7],[8,1],[9,7],[3,3],[5,5],[[[10,[-1]]],[[10,[-1]]],11],[12,12],[8,8],[[-1,-2],13,[],[]],[[-1,-2],13,[],[]],[[-1,-2],13,[],[]],[[-1,-2],13,[],[]],[[-1,-2],13,[],[]],[[3,3],14],[[-1,-2],14,[],[]],[[1,1],2],[[1,1,[15,[[13,[1,1]]]]],[[18,[16,17]]]],[9,[[21,[[20,[19]]]]]],[-1,[[18,[3]]],22],[-1,[[18,[5]]],22],[-1,[[18,[8]]],22],[-1,[[18,[3]]],22],0,[3,[[23,[1]]]],[[3,3],7],[[8,24],7],[[8,8],7],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],0,[[3,25],[[18,[13,26]]]],[[3,25],[[18,[13,26]]]],[[27,25],28],[[4,25],28],[[5,25],28],[[5,25],[[18,[13,26]]]],[[12,25],28],[[8,25],[[18,[13,26]]]],[[8,25],[[18,[13,26]]]],[3,[[23,[1]]]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[29,[[18,[27,30]]]],[29,[[18,[27,30]]]],[-1,[[18,[3,13]]],[[32,[31]]]],[-1,[[18,[3,13]]],[[32,[31]]]],[1,[[18,[3,33]]]],[1,[[18,[12]]]],[1,2],[[-1,-2],34,[35,36],37],[[-1,-2],34,[35,36],37],[[],[[23,[38]]]],[3,7],[3,7],[[3,-1],13,39],[[8,-1],13,39],0,0,0,[[[41,[40]]],[[18,[42,43]]]],[3,[[23,[[44,[1]]]]]],[3,[[23,[1]]]],0,[[3,45],1],[[3,[47,[46]]],1],[[3,[48,[46]]],1],[[3,[49,[46]]],1],[7,13],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[3,[[18,[[50,[13]],51]]]],[3,[[18,[[50,[13]],51]]]],[-1,[[53,[52]]],[]],[3,52],[12,7],[8,7],[8,7],[8,7],[8,7],[3,7],[8,7],[[3,1],[[18,[3,33]]]],[31,9],[[3,3],[[23,[52]]]],0,0,[[1,12],12],[[],54],[1,2],[3,55],[1,[[18,[3,33]]]],[[1,-1],[[18,[3,33]]],56],[[3,3],[[23,[14]]]],[3,[[23,[1]]]],[3,1],[3,[[23,[[58,[57]]]]]],[3,[[18,[59,13]]]],[3,[[23,[24]]]],[3,[[23,[24]]]],[3,[[23,[1]]]],[3,60],[3,[[62,[61]]]],0,0,0,0,[3,1],[[3,-1],18,63],[[8,-1],18,63],[[3,-1],18,63],[[3,[23,[1]]],13],[[3,[23,[1]]],[[18,[13,33]]]],[[3,64],[[18,[13,13]]]],[[3,[23,[1]]],[[18,[13,13]]]],[[3,1],13],[[3,[23,[24]]],[[18,[13,13]]]],[[3,[23,[1]]],13],[[3,1],[[18,[13,13]]]],[[3,1],[[18,[13,13]]]],0,[[3,-1],[[18,[[67,[65,66]],68]]],69],[3,[[18,[2,13]]]],[3,[[18,[68]]]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,52,[]],[-1,52,[]],[-1,52,[]],[-1,[[18,[-2]]],[],[]],[1,[[18,[3]]]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[1,[[18,[12]]]],[-1,[[18,[-2]]],[],[]],[24,[[18,[8]]]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,70,[]],[-1,70,[]],[-1,70,[]],[-1,70,[]],[-1,70,[]],[-1,70,[]],[-1,70,[]],[[27,29],[[18,[13,30]]]],[[27,29],[[18,[13,30]]]],[3,1],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[[3,34,34],13],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[-1,71,[]],[[[72,[-1,-2]],1,-3],[[18,[[72,[-1,-2]],73]]],[74,75],[],[74,75,69]],[73,[[23,[76]]]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[73,[[23,[71]]]],[73,73],[77,77],[78,78],[[-1,-2],13,[],[]],[[-1,-2],13,[],[]],[[-1,-2],13,[],[]],[[],78],[[[72,[-1,-2]],1,-3],[[18,[[72,[-1,-2]],73]]],[74,75,79],[],[74,75,69]],[73,1],[[[72,[-1,-2]]],1,[],[]],0,[-1,[[18,[77]]],22],[-1,[[18,[78]]],22],[[[72,[-1,-2]]],80,[],[]],[[77,77],7],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[73,25],28],[[73,25],28],[[77,25],28],[[78,25],28],[[[72,[-1,-2]],25],28,[],[]],0,[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,[[18,[[72,[-2,-3]],73]]],[[32,[31]]],[],[]],[[[72,[-1,-2]],1,-3],[[18,[[72,[-1,-2]],73]]],[74,75,81],[],[74,75,69]],0,0,0,0,[[[72,[-1,-2]],82,-1],42,[],[]],0,0,[[[72,[-1,-2]],1],[[83,[-1,-2]]],[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[[[72,[-1,-2]]],[],[],[]],[[[72,[-1,-2]]],[],[],[]],[[[72,[-1,-2]],-3],[[72,[-1,-4]]],[74,75],[74,75],[11,74,75,69],[]],[[[72,[-1,-2]],1,-3],[[18,[[72,[-1,-2]],73]]],[74,75,81],[],[74,75,69]],0,[-1,[[18,[[72,[-2,-3]],73]]],[[84,[9]]],[],[]],[[[85,[-1,-2]]],23,[],[]],0,0,0,0,[[[72,[-1,-2]],1,-3],[[18,[[72,[-1,-2]],73]]],[74,75,79],[],[74,75,69]],[[[72,[-1,-2]],1,-3],[[18,[[72,[-1,-2]],73]]],[74,75,79],[],[74,75,69]],0,[[[72,[-1,-2]]],[[0,[86]]],[],[]],[[77,-1],18,63],[[78,-1],18,63],[[[72,[-1,-2]],1,-3],[[18,[[72,[-1,-2]],73]]],[74,75],[74,87],[74,75,69]],[73,[[23,[71]]]],0,[[[72,[-1,-2]],1,-3],[[18,[[72,[-1,-2]],73]]],[74,75],[74,87],[74,75,69]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,52,[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,70,[]],[-1,70,[]],[-1,70,[]],[-1,70,[]],[-1,70,[]],[[[72,[-1,-2]]],77,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[[[72,[-1,-2]],-3],[[72,[-1,-2]]],[74,75],[],[74,75,69]],[[[72,[-1,-2]],2],[[72,[-1,-2]]],[],[]],[[[72,[-1,-2]],88],[[72,[-1,-2]]],[],[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[-1,[[91,[[90,[89,66]]]]],[]],0,[-1,71,[]],[92,[[23,[76]]]],[[-1,[93,[-2]]],[[91,[[90,[89,66]]]]],[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[92,[[23,[71]]]],[92,92],[94,94],[95,95],[[-1,-2],13,[],[]],[[-1,-2],13,[],[]],[[-1,-2],13,[],[]],[[[96,[-1,-3,-2]]],[],[74,75],[74,75],[[97,[-2]]]],[[[96,[-1,-3,-2]]],[],[74,75],[74,75],[[97,[-2]]]],[92,1],[-1,[[18,[94]]],22],[-1,[[18,[95]]],22],0,[[[96,[-1,-3,-2]]],13,[74,75],[74,75],[[97,[-2]]]],[[94,94],7],[[95,95],7],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[92,25],28],[[92,25],28],[[94,25],28],[[95,25],28],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[[[98,[-1,-2]],82,-1],94,[74,75],[]],[-1,[[67,[99,66]]],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[[[98,[-1,-3]],1,-4],[[18,[[96,[-1,-3,-2]],92]]],[74,75],[74,75],[[97,[-2]]],[[84,[9]]]],[[[98,[-1,-2]],82,-1,1],[[23,[42]]],[74,75],[]],0,0,[[[98,[-1,-3]],1,[72,[-1,-2]]],[[18,[[98,[-1,-3]],92]]],[74,75],[74,75],[[97,[-2]]]],[[94,-1],18,63],[[95,-1],18,63],[[[98,[-1,-2]],-3],[[100,[13]]],[74,75],101,[[102,[[21,[[98,[-1,-2]]]]]]]],[92,[[23,[71]]]],[94,8],0,[-1,[[18,[68]]],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,52,[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,70,[]],[-1,70,[]],[-1,70,[]],[-1,70,[]],[-1,70,[]],[[[98,[-1,-2]]],95,[74,75],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,[[98,[-1,-2]]],[74,75],[]],[[[98,[-1,-2]],88],[[98,[-1,-2]]],[74,75],[]],0,0,0,[-1,71,[]],[103,[[23,[76]]]],[-1,-2,[],[]],[-1,-2,[],[]],[[8,52],-1,[]],[[8,52],103],[103,[[23,[71]]]],[103,103],[[-1,-2],13,[],[]],[103,1],[-1,[[18,[103]]],22],[[103,103],7],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[103,25],28],[[103,25],28],[-1,-1,[]],[[[104,[-1]]],103,87],[68,103],[105,103],[[[106,[-1]]],103,87],[17,103],[17,-1,[]],[68,-1,[]],[105,-1,[]],[[[106,[-1]]],-2,87,[]],[43,-1,[]],[[[104,[-1]]],-2,87,[]],[-1,-2,[],[]],[-1,43,[]],0,[[103,-1],18,63],[103,[[23,[71]]]],[-1,8,[]],[103,8],0,[-1,-2,[],[]],[-1,52,[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,70,[]],[-1,-2,[],[]],0,0,0,0,0,0,0,0,[-1,-2,[],[]],[-1,-2,[],[]],[107,107],[[-1,-2],13,[],[]],[[],107],[-1,[[18,[107]]],22],[[107,107],7],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[107,25],28],[-1,-1,[]],[-1,-2,[],[]],[[107,-1],18,63],[-1,8,[]],[107,8],[-1,-2,[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,70,[]],[-1,-2,[],[]],0,0,0,0,0,0,0,0,[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[108,108],[[-1,-2],13,[],[]],[[],108],[[108,108],7],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[108,25],28],[[108,25],28],[-1,-1,[]],[109,108],[-1,-1,[]],[1,[[18,[108]]]],[[],108],[-1,-2,[],[]],[-1,-2,[],[]],[108,7],[108,7],[[],108],[[],108],[[],108],[[-1,-2],[[91,[[90,[89]]]]],[],[74,110]],[[],108],[-1,-2,[],[]],[-1,52,[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,70,[]],[-1,70,[]],[-1,-2,[],[]],[-1,-2,[],[]],[[-1,-2],[[91,[[90,[89]]]]],[],[74,110]],0,0,[-1,[[18,[52]]],[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[82,[[18,[111,105]]]],[112,[[18,[-1,105]]],[[114,[113]]]],[112,[[18,[7,105]]]],[-1,71,[]],[112,[[18,[-1,105]]],[[114,[115]]]],[112,[[18,[1,105]]]],[112,[[18,[113,105]]]],[105,[[23,[76]]]],[[82,-1],[[18,[-2,105]]],[36,87],[[114,[113]]]],[82,[[18,[-1,105]]],116],[82,[[67,[117]]]],[82,[[18,[-1,105]]],116],[[82,-1],[[18,[7,105]]],[36,87]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[105,[[23,[71]]]],[105,105],[82,82],[112,112],[118,118],[119,119],[[-1,-2],13,[],[]],[[-1,-2],13,[],[]],[[-1,-2],13,[],[]],[[-1,-2],13,[],[]],[[-1,-2],13,[],[]],[105,1],[-1,[[18,[105]]],22],[-1,[[18,[118]]],22],[[112,112],7],[[118,118],7],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[105,25],28],[[105,25],28],[[82,25],28],[[112,25],28],[[118,25],[[18,[13,26]]]],[[118,25],28],[[119,25],28],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[1,[[18,[118]]]],[82,120],[[82,-1],[[18,[-2,105]]],[36,87],[[114,[115]]]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[82,108],0,[[[41,[-1]],119],[[18,[[23,[112]],105]]],[]],[[82,-1],[[18,[[23,[-2]],105]]],[36,87],[[114,[113]]]],[[82,-1],[[18,[[23,[7]],105]]],[36,87]],[[82,-1],[[18,[[23,[-2]],105]]],[36,87],[[114,[115]]]],[[82,-1],[[23,[112]]],[36,87]],[[82,-1],[[18,[[23,[1]],105]]],[36,87]],[[82,-1],[[18,[[23,[113]],105]]],[36,87]],[[82,-1],[[18,[112,105]]],[36,87]],[112,118],0,[[1,119],[[18,[112,105]]]],[82,[[23,[1]]]],[[105,-1],18,63],[[118,-1],18,63],[105,[[23,[71]]]],[[82,-1],[[18,[1,105]]],[36,87]],[[82,-1],[[18,[113,105]]],[36,87]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,52,[]],[-1,52,[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[1,[[18,[118]]]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,70,[]],[-1,70,[]],[-1,70,[]],[-1,70,[]],[-1,70,[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[-1,71,[]],[121,[[23,[76]]]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[121,[[23,[71]]]],[121,121],[[-1,-2],13,[],[]],[121,1],[[[83,[-1,-2]]],80,[],[]],[[[106,[-1]],25],28,87],[[[83,[-1,-2]],25],28,[],[]],[[121,25],28],[[121,25],28],[-1,-1,[]],[105,[[106,[-1]]],[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[[[83,[-1,-2]]],7,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[[[106,[-1]],-2],[[106,[-3]]],[],69,[]],[[[83,[-1,-2]],-3],[[83,[-1,-4]]],[74,75],[74,75],[74,75,69],[]],[[[83,[-1,-2]]],108,[],[]],[[[83,[-1,-2]]],52,[],[]],[[52,9,[21,[78]]],[[18,[[83,[-1,-2]],121]]],[],[]],[[[83,[-1,-2]]],[[15,[119]]],[],[]],[[[83,[-1,-2]]],[[0,[86]]],[],[]],[121,[[23,[71]]]],[[[106,[-1]]],8,[]],[-1,-2,[],[]],[-1,52,[]],[-1,52,[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,70,[]],[-1,70,[]],[-1,70,[]],[-1,70,[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],0,0,0,0,0,0,0,0,0,0,0,[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[[[104,[-1]]],122,[]],[[[123,[-1,-2,-3]]],13,36,[],[]],[[[104,[-1]],25],28,87],[[[104,[-1]],25],28,124],[-1,-1,[]],[51,[[104,[-1]]],[]],[-1,-1,[]],[105,[[104,[-1]]],[]],[125,[[104,[-1]]],[]],[126,[[104,[-1]]],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[[[104,[-1]],-2],[[104,[-3]]],[],69,[]],[[[91,[[123,[-1,-2,-3]]]],127],[[128,[[18,[13]]]]],[129,36],[],[]],[[[91,[[123,[-1,-2,-3]]]],127],[[128,[[18,[13]]]]],[129,36],[],[]],[[[91,[[123,[-1,-2,-3]]]],127],[[128,[23]]],36,116,[]],[[[91,[[123,[-1,-2,-3]]]],127],[[128,[[18,[13]]]]],[129,36],[],[]],[[[91,[[123,[-1,-2,-3]]]],-1],[[18,[13]]],[129,36],[],[]],[[[104,[-1]]],8,[]],[-1,52,[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[-1,[[18,[-2]]],[],[]],[[[91,[-1]],127],[[128,[[23,[18]]]]],[]],[-1,70,[]],[-1,70,[]],[-1,-2,[],[]],[-1,-2,[],[]],0,0],"c":[215],"p":[[15,"str"],[3,"PathBuf",942],[3,"Url",0],[4,"DiscoKey",0],[4,"HealthStatus",0],[3,"Command",943],[15,"bool"],[4,"StatusCode",0],[4,"Value",944],[3,"ServerState",0],[8,"Clone",945],[4,"UrlSegment",0],[15,"tuple"],[4,"Ordering",946],[15,"slice"],[3,"Config",947],[4,"ConfigError",948],[4,"Result",949],[15,"usize"],[3,"Router",950],[3,"Arc",951],[8,"Deserializer",952],[4,"Option",953],[15,"u16"],[3,"Formatter",954],[3,"Error",954],[3,"DiscoArgs",0],[6,"Result",954],[3,"ArgMatches",955],[6,"Error",956],[3,"Path",942],[8,"AsRef",957],[4,"ParseError",958],[15,"u64"],[8,"Hash",959],[8,"Sized",960],[8,"BuildHasher",959],[3,"Id",961],[8,"Hasher",959],[6,"AppServerState",0],[3,"Request",962],[3,"Response",963],[3,"Error",964],[4,"Host",965],[3,"RangeFull",966],[4,"Position",967],[3,"Range",966],[3,"RangeFrom",966],[3,"RangeTo",966],[3,"Request",968],[4,"Error",969],[3,"String",970],[4,"Resettable",971],[3,"ParseOptions",972],[4,"Origin",973],[8,"IntoIterator",974],[15,"char"],[3,"Split",975],[3,"PathSegmentsMut",976],[3,"Parse",977],[3,"UrlQuery",972],[3,"Serializer",977],[8,"Serializer",978],[4,"IpAddr",979],[4,"SocketAddr",980],[3,"Global",981],[3,"Vec",982],[3,"Error",983],[8,"Fn",984],[3,"TypeId",985],[8,"Error",986],[3,"Api",308],[4,"ApiError",308],[8,"Send",960],[8,"Sync",960],[3,"Backtrace",987],[3,"ApiVersion",308],[3,"ApiMetadata",308],[8,"WriteState",618],[6,"Html",0],[8,"ReadState",618],[3,"RequestParams",667],[3,"Route",815],[8,"Into",957],[3,"RoutesWithPath",308],[8,"Iterator",988],[8,"Display",954],[3,"Version",989],[8,"Future",990],[3,"Box",991],[3,"Pin",992],[4,"AppError",441],[3,"Server",993],[3,"AppHealth",441],[3,"AppVersion",441],[3,"Module",441],[8,"From",957],[3,"App",441],[3,"ListenInfo",994],[6,"Result",983],[8,"Error",544],[8,"ToListener",441],[3,"ServerError",544],[4,"SocketError",896],[4,"RequestError",667],[4,"RouteError",815],[4,"HealthStatus",589],[4,"Method",618],[4,"Method",995],[8,"FnOnce",984],[3,"Accept",996],[4,"RequestParamValue",667],[3,"TaggedBase64",997],[8,"TryFrom",957],[15,"u128"],[8,"DeserializeOwned",952],[15,"u8"],[4,"RequestParamType",667],[3,"RequestParam",667],[3,"Headers",998],[4,"RouteParseError",815],[4,"CloseCode",999],[3,"Connection",896],[8,"Debug",954],[6,"Error",1000],[3,"Error",1001],[3,"Context",1002],[4,"Poll",1003],[8,"Serialize",978],[6,"AppState",0],[13,"IncorrectMethod",434],[13,"CannotReadToml",434],[13,"AmbiguousRoutes",434],[13,"Route",434],[13,"InvalidMetaTable",434],[8,"Listener",441],[13,"Api",543],[8,"HealthCheck",589],[3,"ParseMethodError",618],[8,"Metrics",664],[13,"IncorrectParamType",804],[13,"TagMismatch",804],[13,"IntegerOverflow",804],[13,"MissingParam",804],[13,"InvalidParam",804],[13,"TaggedBase64",804],[13,"Http",804],[3,"MapErr",815],[13,"IncorrectMethod",895],[13,"IncorrectMethod",940]]}\
+"tide_disco":{"doc":"Tide Disco is a web server framework with built-in …","t":"CCGGNNNNNDECNENGNNNCCCCCCRRDNCNNNNDEMNAMNAFMMNLLLLLLLMNLLLLLLLLLLLLLFLLLLLLLLLLFFFLLLNLLLLLALLLLLLLLLLLLLLLLLLLLFLLLLLMMAFLLCLLLLFLLLLLLLLLLLLLFLAALLFLLLLLLLLLLLLLAAMMLLLLLLLLLLLLALALLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLFNDEDNDNNNNNNNNNDNMLLLLLLLLLLLLLLLLLLLLLLLLMLLLLLLLLLLLLMLLLLLLLMMMMLMMLLLLLLLLLLLMLLMMMMLLMLLLLLMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMNDEDDIQDNIKMLLKLLLLLLLLLLLLLLLLLLLLLLMLLLLLLLLLLLLLLLLLLLKLLLLLLLMMLLLLLLMKLLLLLLLLLLLLLLLLLLLLLLLLLLLMIDLLLLKLLLLLLLLLLLLLLLLLLLLLLLLLLMLLKLMLLLLLLNIENNNNNLLLLLLLLLLLLLLKLLLLLLNENDINQILLLLLLLLLLLLLLLLLLLLLLLLLKLLLLLLLLLLLKQIKNNNNNNNNNNNNNNNEDEEDNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMLLLLLLLLLMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMMMNNNNNNNNNNDNNNNNDENENNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMNNNDNNNENNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNENNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL","n":["Api","App","AppServerState","AppState","Array","Available","Boolean","Boolean","Datetime","DiscoArgs","DiscoKey","Error","Float","HealthStatus","Hexadecimal","Html","Integer","Integer","Literal","Method","RequestError","RequestParam","RequestParamType","RequestParamValue","RequestParams","SERVER_STARTUP_RETRIES","SERVER_STARTUP_SLEEP_MS","ServerState","Starting","StatusCode","Stopping","String","Table","TaggedBase64","Url","UrlSegment","ansi_color","ansi_color","api","api_toml","api_toml","app","app_api_path","app_state","app_state","app_toml","as_ref","as_ref","as_ref","as_str","augment_args","augment_args_for_update","authority","base_url","base_url","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","cannot_be_a_base","check_api","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","cmp","compare","compose_config_path","compose_settings","configure_router","deserialize","deserialize","deserialize_internal","disco_toml","domain","eq","equivalent","equivalent","equivalent","error","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fragment","from","from","from","from","from","from","from_arg_matches","from_arg_matches_mut","from_directory_path","from_file_path","from_str","from_str","get_api_path","get_hash","group_id","has_authority","has_host","hash","health_status","health_status","healthcheck","healthcheck","host","host_str","http","index","index","index","index","init_logging","into","into","into","into","into","into","into_client_request","into_client_request","into_resettable","into_string","is_bound","is_special","join","load_api","make_relative","method","metrics","new","options","org_data_path","origin","parse","parse_with_params","partial_cmp","password","path","path_segments","path_segments_mut","port","port_or_known_default","query","query_pairs","query_pairs_mut","request","route","router","router","scheme","serialize","serialize_internal","set_fragment","set_host","set_ip_host","set_password","set_path","set_port","set_query","set_scheme","set_username","socket","socket_addrs","status","to_file_path","to_listener","to_owned","to_owned","to_owned","to_owned","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","update_from_arg_matches","update_from_arg_matches_mut","username","vzip","vzip","vzip","vzip","vzip","vzip","wait_for_server","AmbiguousRoutes","Api","ApiError","ApiMetadata","ApiMustBeTable","ApiVersion","CannotReadToml","HandlerAlreadyRegistered","IncorrectMethod","InvalidFormatVersion","InvalidMetaTable","MissingFormatVersion","MissingRoutesTable","Route","RoutesMustBeTable","RoutesWithPath","UndefinedRoute","api_version","as_error_source","at","backtrace","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","cause","clone","clone","clone","clone_into","clone_into","clone_into","default","delete","description","description","description","deserialize","deserialize","documentation","eq","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","format_version","from","from","from","from","from","from_file","get","heading_description","heading_entry","heading_parameters","heading_routes","health","html_bottom","html_top","index","into","into","into","into","into","into_iter","into_iter","into_iter","map_err","metrics","name","new","next","parameter_none","parameter_row","parameter_table_close","parameter_table_open","post","put","route_path","routes_by_path","serialize","serialize","socket","source","spec_version","stream","to_owned","to_owned","to_owned","to_string","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","version","vzip","vzip","vzip","vzip","vzip","with_health_check","with_public","with_version","actual","expected","reason","route1","route2","source","source","Api","App","AppError","AppHealth","AppVersion","Listener","Listener","Module","ModuleAlreadyExists","ToListener","accept","app_version","as_error_source","backtrace","bind","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","cause","clone","clone","clone","clone_into","clone_into","clone_into","deref","deref_mut","description","deserialize","deserialize","disco_version","drop","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","from","from","from","from","from","health","info","into","into","into","into","into","module","module_health","modules","modules","register_module","serialize","serialize","serve","source","status","status","to_listener","to_owned","to_owned","to_owned","to_string","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","version","vzip","vzip","vzip","vzip","vzip","with_state","with_version","source","Error","ServerError","as_error_source","backtrace","borrow","borrow_mut","catch_all","catch_all","cause","clone","clone_into","description","deserialize","eq","equivalent","equivalent","equivalent","fmt","fmt","from","from","from","from","from","from","from_config_error","from_io_error","from_request_error","from_route_error","from_server_error","from_socket_error","into","into_tide_error","message","serialize","source","status","status","status","to_owned","to_string","try_from","try_into","type_id","vzip","Available","HealthCheck","HealthStatus","Initializing","ShuttingDown","TemporarilyUnavailable","Unavailabale","Unhealthy","borrow","borrow_mut","clone","clone_into","default","deserialize","eq","equivalent","equivalent","equivalent","fmt","from","into","serialize","status","status","to_owned","try_from","try_into","type_id","vzip","Http","Method","Metrics","ParseMethodError","ReadState","Socket","State","WriteState","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","delete","eq","equivalent","equivalent","equivalent","fmt","fmt","from","from","from","from_str","get","into","into","is_http","is_mutable","metrics","post","put","read","socket","to_owned","to_string","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","write","Error","Metrics","export","Bincode","Boolean","Boolean","Hexadecimal","Hexadecimal","Http","IncorrectParamType","Integer","Integer","IntegerOverflow","InvalidParam","Json","Literal","Literal","MissingParam","RequestError","RequestParam","RequestParamType","RequestParamValue","RequestParams","TagMismatch","TaggedBase64","TaggedBase64","TaggedBase64","UnsupportedContentType","accept","as_blob","as_boolean","as_error_source","as_integer","as_string","as_tagged_base64","backtrace","blob_param","body_auto","body_bytes","body_json","boolean_param","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","cause","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","description","deserialize","deserialize","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from_str","headers","integer_param","into","into","into","into","into","method","name","new","opt_blob_param","opt_boolean_param","opt_integer_param","opt_param","opt_string_param","opt_tagged_base64_param","param","param_type","param_type","parse","remote","serialize","serialize","source","string_param","tagged_base64_param","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","actual","actual","expected","expected","expected","name","param_type","reason","reason","reason","value","AppSpecific","Bincode","ExportMetrics","IncorrectDocType","IncorrectMethod","IncorrectParamType","IncorrectPathType","InvalidMethod","InvalidTypeExpression","Json","MapErr","MethodMustBeString","MissingPath","MissingPathArray","PathElementError","Request","Route","RouteError","RouteMustBeTable","RouteParseError","Tide","UnrecognizedType","UnsupportedContentType","as_error_source","backtrace","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","cause","clone","clone_into","description","documentation","fmt","fmt","fmt","fmt","from","from","from","from","from","has_handler","into","into","into","into","map_app_specific","map_err","method","name","new","params","patterns","source","status","to_owned","to_string","to_string","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","expected","AppSpecific","Bincode","Closed","Connection","IncorrectMethod","Json","Request","SocketError","UnsupportedMessageType","WebSockets","borrow","borrow","borrow_mut","borrow_mut","code","drop","fmt","fmt","from","from","from","from","from","from","into","into","into_stream","map_app_specific","poll_close","poll_flush","poll_next","poll_ready","start_send","status","to_string","try_from","try_from","try_into","try_into","try_poll_next","type_id","type_id","vzip","vzip","actual","expected","Accepted","BadGateway","BadRequest","Conflict","Continue","Created","EarlyHints","ExpectationFailed","FailedDependency","Forbidden","Found","GatewayTimeout","Gone","HttpVersionNotSupported","ImATeapot","ImUsed","InsufficientStorage","InternalServerError","LengthRequired","Locked","LoopDetected","MethodNotAllowed","MisdirectedRequest","MovedPermanently","MultiStatus","MultipleChoice","NetworkAuthenticationRequired","NoContent","NonAuthoritativeInformation","NotAcceptable","NotExtended","NotFound","NotImplemented","NotModified","Ok","OutOfRangeError","PartialContent","PayloadTooLarge","PaymentRequired","PermanentRedirect","PreconditionFailed","PreconditionRequired","ProxyAuthenticationRequired","RequestHeaderFieldsTooLarge","RequestTimeout","RequestedRangeNotSatisfiable","ResetContent","SeeOther","ServiceUnavailable","StatusCode","SwitchingProtocols","TemporaryRedirect","TooEarly","TooManyRequests","Unauthorized","UnavailableForLegalReasons","UnprocessableEntity","UnsupportedMediaType","UpgradeRequired","UriTooLong","VariantAlsoNegotiates","as_error_source","backtrace","borrow","borrow","borrow_mut","borrow_mut","canonical_reason","cause","clone","clone","clone_into","clone_into","description","deserialize","eq","eq","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","from","from","from","from_i64","from_u64","get_hash","hash","into","into","is_client_error","is_informational","is_redirection","is_server_error","is_success","serialize","source","to_owned","to_owned","to_string","to_string","try_from","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip"],"q":[[0,"tide_disco"],[220,"tide_disco::api"],[346,"tide_disco::api::ApiError"],[353,"tide_disco::app"],[455,"tide_disco::app::AppError"],[456,"tide_disco::error"],[501,"tide_disco::healthcheck"],[530,"tide_disco::method"],[576,"tide_disco::metrics"],[579,"tide_disco::request"],[716,"tide_disco::request::RequestError"],[727,"tide_disco::route"],[807,"tide_disco::route::RouteError"],[808,"tide_disco::socket"],[852,"tide_disco::socket::SocketError"],[854,"tide_disco::status"],[967,"std::path"],[968,"clap_builder::builder::command"],[969,"toml::value"],[970,"core::clone"],[971,"core::cmp"],[972,"config::config"],[973,"config::error"],[974,"core::result"],[975,"routefinder::router"],[976,"alloc::sync"],[977,"serde::de"],[978,"core::option"],[979,"core::fmt"],[980,"core::fmt"],[981,"clap_builder"],[982,"std::path"],[983,"url::parser"],[984,"core::hash"],[985,"core::marker"],[986,"core::hash"],[987,"core::hash"],[988,"tide::response"],[989,"http_types::error"],[990,"url::host"],[991,"url::slicing"],[992,"core::ops::range"],[993,"core::ops::range"],[994,"tungstenite::error"],[995,"alloc::string"],[996,"clap_builder::builder::resettable"],[997,"url"],[998,"url::origin"],[999,"core::iter::traits::collect"],[1000,"core::str::iter"],[1001,"url::path_segments"],[1002,"form_urlencoded"],[1003,"url"],[1004,"core::net::ip_addr"],[1005,"core::net::socket_addr"],[1006,"alloc::alloc"],[1007,"alloc::vec"],[1008,"std::io::error"],[1009,"core::ops::function"],[1010,"core::any"],[1011,"core::error"],[1012,"core::marker"],[1013,"core::convert"],[1014,"core::fmt"],[1015,"core::future::future"],[1016,"alloc::boxed"],[1017,"core::pin"],[1018,"tide::server"],[1019,"core::convert"],[1020,"std::io::error"],[1021,"core::ops::function"],[1022,"tagged_base64"],[1023,"core::convert"],[1024,"tungstenite::protocol::frame::coding"],[1025,"core::fmt"],[1026,"bincode::error"],[1027,"core::task::wake"],[1028,"core::task::poll"],[1029,"serde::ser"]],"d":["","","","","Represents a TOML array","","Represents a TOML boolean","","Represents a TOML datetime","","Configuration keys for Tide Disco settings","","Represents a TOML float","","","","Represents a TOML integer","","","","","","","","","Number of times to poll before failing","Number of milliseconds to sleep between attempts","","","","","Represents a TOML string","Represents a TOML table","","A parsed URL record.","","If true, log in color. Otherwise, no color.","","","HTTP routes","","","","","","","","","","Return the serialization of this URL.","","","Return the authority of this URL as an ASCII string.","Server address","","","","","","","","","","","","","","Return whether this URL is a cannot-be-a-base URL, meaning …","Check api.toml for schema compliance errors","","","","","","","","","","","Compose the path to the application’s configuration file","Get the application configuration","Add routes from api.toml to the routefinder instance in …","","","Serialize with Serde using the internal representation of …","","If this URL has a host and it is a domain name (not an IP …","","","","","","","","","","","","","Return this URL’s fragment identifier, if any.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","Convert a directory name as std::path::Path into an URL in …","Convert a file name as std::path::Path into an URL in the …","","","Get the path to api.toml","","","Return whether the URL has an ‘authority’, which can …","Equivalent to url.host().is_some().","","","","","Return a JSON expression with status 200 indicating the …","Return the parsed representation of the host for this URL. …","Return the string representation of the host (domain or IP …","","","","","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","Return the serialization of this URL.","","Return whether the URL is special (has a special scheme)","Parse a string as an URL, with this URL as the base URL.","Load the web API or panic","Creates a relative URL if possible, with this URL as the …","Interfaces for methods of accessing to state.","Support for routes using the Prometheus metrics format.","","Return a default ParseOptions that can fully configure the …","","Return the origin of this URL (…","Parse an absolute URL from a string.","Parse an absolute URL from a string and add params to its …","","Return the password for this URL, if any, as a …","Return the path for this URL, as a percent-encoded ASCII …","Unless this URL is cannot-be-a-base, return an iterator of …","Return an object with methods to manipulate this URL’s …","Return the port number for this URL, if any.","Return the port number for this URL, or the default port …","Return this URL’s query string, if any, as a …","Parse the URL’s query string, if any, as …","Manipulate this URL’s query string, viewed as a sequence …","","","","","Return the scheme of this URL, lower-cased, as an ASCII …","","Serialize with Serde using the internal representation of …","Change this URL’s fragment identifier.","Change this URL’s host.","Change this URL’s host to the given IP address.","Change this URL’s password.","Change this URL’s path.","Change this URL’s port number.","Change this URL’s query string.","Change this URL’s scheme.","Change this URL’s username.","An interface for asynchronous communication with clients, …","Resolve a URL’s host and port number to SocketAddr.","","Assuming the URL is in the file scheme or similar, convert …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Return the username for this URL (typically the empty …","","","","","","","Wait for the server to respond to a connection request","","A description of an API.","An error encountered when parsing or constructing an Api.","Metadata used for describing and documenting an API.","","Version information about an API.","","","","","","","","","","Iterator for routes_by_path.","","The version of this API.","","Register a handler for a route.","","","","","","","","","","","","","","","","","","","","Register a handler for a DELETE route.","","The description of this API from the specification.","A description of this API.","","","Compose an HTML page documenting all the routes in this …","","","","","","","","","","The version of the Tide Disco API specification format.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Create an Api by reading a TOML specification from a file.","Register a handler for a GET route.","The heading preceding documentation of a route description.","The heading for documentation of a route.","The heading preceding documentation of route parameters.","The heading preceding documentation of all routes in this …","Check the health status of a server with the given state.","HTML to be appended to automatically generated …","HTML to be prepended to automatically generated …","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","Create a new Api which is just like this one, except has a …","Register a handler for a METRICS route.","The name of this API.","Parse an API from a TOML specification.","","Documentation to insert in the parameters section of a …","HTML formatting an entry in a table documenting the …","HTML closing a table documenting the parameters of a route.","HTML preceding the contents of a table documenting the …","Register a handler for a POST route.","Register a handler for a PUT route.","HTML formatting the path of a route.","Iterate over groups of routes with the same path.","","","Register a handler for a SOCKET route.","","The format version of the TOML specification used to load …","Register a uni-directional handler for a SOCKET route.","","","","","","","","","","","","","","","","","","","","Get the version of this API.","","","","","","Set the health check handler for this API.","Serve the contents of dir at the URL /public/{{NAME}}.","Set the API version.","","","","","","","","","A tide-disco server application.","An error encountered while building an App.","The health status of an application.","Version information about an application.","The Listener trait represents an implementation of http …","What listener are we converting into?","","","ToListener represents any type that can be converted into a","Start accepting incoming connections. This method must be …","The version of this application.","","","Bind the listener. This starts the listening process by …","","","","","","","","","","","","","","","","","","","","","","","The version of the Tide Disco server framework.","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Check the health of each registered module in response to …","Expose information about the connection. This should …","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Create and register an API module.","Check the health of the named module.","The status of each registered module.","The version of each module registered with this …","Register an API module.","","","Serve the App asynchronously.","","","The status of the overall application.","Transform self into a Listener. Unless self is already …","","","","","","","","","","","","","","","","","","","","Get the version of this application.","","","","","","Create a new App with a given state.","Set the application version.","","Errors which can be serialized in a response body.","The simplest possible implementation of Error.","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","","","","","","","","","","","Calls U::from(self).","","","","","","","","","","","","","","","A response to a healthcheck endpoint.","Common health statuses of an application.","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Calls U::from(self).","","The status of this health check.","","","","","","","","","","","A state which allows read access.","","The type of state which this type allows a caller to read.","A state which allows exclusive, write access.","","","","","","","The HTTP DELETE method.","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","","The HTTP GET method.","Calls U::from(self).","Calls U::from(self).","Check if a method is a standard HTTP method.","Check if a request method implies mutable access to the …","The Tide Disco METRICS method.","The HTTP POST method.","The HTTP PUT method.","Do an operation with immutable access to the state.","The Tide Disco SOCKET method.","","","","","","","","","","","Do an operation with mutable access to the state.","","","","","","","","","","","","","","","","","","","","","","","Parameters passed to a route handler.","","","","","","The Accept header of this request.","","","","","","","","Get the value of a named parameter and convert it to a …","Deserialize the body of a request.","","","Get the value of a named parameter and convert it to a bool…","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","The headers of the incoming request.","Get the value of a named parameter and convert it to an …","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","The Method used to dispatch the request.","","Parse a parameter from a Request.","Get the value of a named optional parameter and convert it …","Get the value of a named optional parameter and convert it …","Get the value of a named optional parameter and convert it …","Get the value of a named optional parameter.","Get the value of a named optional parameter and convert it …","Get the value of a named optional parameter and convert it …","Get the value of a named parameter.","","","","Get the remote address for this request.","","","","Get the value of a named parameter and convert it to a …","Get the value of a named parameter and convert it to …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","All the information we need to parse, typecheck, and …","An error returned by a route handler.","","","","","","","","","","","","","","","","","","","","Compose an HTML fragment documenting all the variations on …","","","","","Returns the argument unchanged.","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Whether a non-default handler has been bound to this route.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","Create a new route with a modified error type.","The HTTP method of the route.","The name of the route.","Parse a Route from a TOML specification.","Get all formal parameters.","Iterate over route patterns.","","","","","","","","","","","","","","","","","","","","","","","","","","A connection facilitating bi-directional, asynchronous …","","","","An error returned by a socket handler.","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","","","","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","202 Accepted","502 Bad Gateway","400 Bad Request","409 Conflict","100 Continue","201 Created","103 Early Hints","417 Expectation Failed","424 Failed Dependency","403 Forbidden","302 Found","504 Gateway Timeout","410 Gone","505 HTTP Version Not Supported","418 I’m a teapot","226 Im Used","507 Insufficient Storage","500 Internal Server Error","411 Length Required","423 Locked","508 Loop Detected","405 Method Not Allowed","421 Misdirected Request","301 Moved Permanently","207 Multi-Status","300 Multiple Choice","511 Network Authentication Required","204 No Content","203 Non Authoritative Information","406 Not Acceptable","510 Not Extended","404 Not Found","501 Not Implemented","304 Not Modified","200 Ok","","206 Partial Content","413 Payload Too Large","402 Payment Required","308 Permanent Redirect","412 Precondition Failed","428 Precondition Required","407 Proxy Authentication Required","431 Request Header Fields Too Large","408 Request Timeout","416 Requested Range Not Satisfiable","205 Reset Content","303 See Other","503 Service Unavailable","Serializable HTTP status code.","101 Switching Protocols","307 Temporary Redirect","425 Too Early","429 Too Many Requests","401 Unauthorized","451 Unavailable For Legal Reasons","422 Unprocessable Entity","415 Unsupported Media Type","426 Upgrade Required","414 URI Too Long","506 Variant Also Negotiates","","","","","","","The canonical reason for a given status code","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","","","","Calls U::from(self).","Calls U::from(self).","Returns true if the status code is the 4xx range.","Returns true if the status code is 1xx range.","Returns true if the status code is the 3xx range.","Returns true if the status code is the 5xx range.","Returns true if the status code is the 2xx range.","","","","","","","","","","","","","","",""],"i":[0,0,0,0,133,5,133,11,133,0,0,0,133,0,11,0,133,11,11,0,0,0,0,0,0,0,0,0,5,0,5,133,133,11,0,0,25,4,0,25,4,0,0,38,9,4,3,4,5,3,25,25,3,25,4,3,25,4,5,9,11,3,25,4,5,9,11,3,0,3,5,9,11,3,5,9,11,3,3,0,0,0,3,5,3,4,3,3,3,3,3,0,3,3,25,4,5,5,11,3,3,25,4,5,9,11,25,25,3,3,3,11,0,3,25,3,3,3,38,9,0,0,3,3,0,3,3,3,3,0,3,25,4,5,9,11,3,3,3,3,11,3,3,0,3,0,0,11,3,0,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,38,9,3,3,3,3,3,3,3,3,3,3,3,3,0,3,0,3,3,3,5,9,11,3,5,3,3,25,4,5,9,11,11,3,25,4,5,9,11,3,25,4,5,9,11,25,25,3,3,25,4,5,9,11,0,72,0,0,0,72,0,72,72,72,72,72,72,72,72,72,0,72,76,72,71,72,84,72,76,77,71,84,72,76,77,71,72,72,76,77,72,76,77,77,71,72,71,77,76,77,71,76,76,76,76,72,72,76,77,71,77,84,72,76,77,71,71,71,77,77,77,77,71,77,77,71,84,72,76,77,71,84,71,71,71,71,77,71,84,77,77,77,77,71,71,77,71,76,77,71,72,76,71,72,76,77,72,84,72,76,77,71,84,72,76,77,71,84,72,76,77,71,71,84,72,76,77,71,71,71,71,134,134,135,136,136,137,138,91,0,0,0,0,0,101,0,91,0,139,94,91,91,139,97,95,91,93,94,97,95,91,93,94,91,91,93,94,91,93,94,95,95,91,93,94,94,95,93,94,93,93,93,94,94,94,91,91,93,94,97,95,91,93,94,97,139,97,95,91,93,94,97,97,93,94,97,93,94,97,91,93,93,101,91,93,94,91,97,95,91,93,94,97,95,91,93,94,97,95,91,93,94,97,97,95,91,93,94,97,97,140,0,0,103,103,103,103,100,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,100,100,100,100,100,100,103,100,103,103,103,100,103,103,103,103,103,103,103,103,107,0,0,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,141,107,107,107,107,107,107,108,0,108,0,0,108,80,0,142,108,142,108,108,108,108,108,108,108,108,108,108,142,108,108,108,108,142,108,108,108,108,108,108,80,108,108,108,142,108,142,108,142,108,142,108,78,143,0,143,104,112,118,112,118,104,104,112,118,104,104,104,112,118,104,0,0,0,0,0,104,104,112,118,104,81,112,112,104,112,112,112,104,81,81,81,81,81,104,81,112,118,119,104,81,112,118,119,104,104,81,112,118,119,104,81,112,118,119,104,104,118,112,118,112,112,112,118,118,118,104,104,81,112,118,118,119,104,81,112,118,119,118,81,81,104,81,112,118,119,81,119,112,81,81,81,81,81,81,81,112,119,112,81,104,118,104,81,81,104,81,112,118,119,104,118,104,81,112,118,118,119,104,81,112,118,119,104,81,112,118,119,104,81,112,118,119,144,145,144,146,145,147,148,149,150,148,146,106,106,106,121,106,121,121,121,121,106,0,121,121,121,121,106,0,0,121,0,106,121,106,121,121,106,151,82,121,106,151,82,121,121,121,121,121,82,106,82,121,121,106,106,151,82,121,82,106,151,82,121,106,82,82,82,82,82,82,121,106,121,106,121,106,151,82,121,106,151,82,121,106,151,82,121,106,151,82,121,152,105,105,105,0,105,105,105,0,105,105,123,105,123,105,105,123,105,105,123,105,105,105,105,105,123,105,123,105,123,123,123,123,123,105,105,123,105,123,105,123,123,105,123,105,153,153,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,0,102,102,102,102,102,102,102,102,102,102,102,102,102,0,102,102,102,102,102,102,102,102,102,102,102,130,130,102,130,102,130,102,130,102,130,102,130,130,102,102,102,102,102,102,102,102,130,130,102,102,130,102,102,102,102,102,130,102,102,102,102,102,102,130,102,130,102,130,102,102,130,102,130,102,130,102,130],"f":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[1,1],2],0,0,0,[3,1],[4,1],[5,1],[3,1],[6,6],[6,6],[3,1],0,0,[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[3,7],[8,7],[3,3],[5,5],[[[9,[-1]]],[[9,[-1]]],10],[11,11],[[-1,-2],12,[],[]],[[-1,-2],12,[],[]],[[-1,-2],12,[],[]],[[-1,-2],12,[],[]],[[3,3],13],[[-1,-2],13,[],[]],[[1,1],2],[[1,1,[14,[[12,[1,1]]]]],[[17,[15,16]]]],[8,[[20,[[19,[18]]]]]],[-1,[[17,[3]]],21],[-1,[[17,[5]]],21],[-1,[[17,[3]]],21],0,[3,[[22,[1]]]],[[3,3],7],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],0,[[3,23],[[17,[12,24]]]],[[3,23],[[17,[12,24]]]],[[25,23],26],[[4,23],26],[[5,23],[[17,[12,24]]]],[[5,23],26],[[11,23],26],[3,[[22,[1]]]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[27,[[17,[25,28]]]],[27,[[17,[25,28]]]],[-1,[[17,[3,12]]],[[30,[29]]]],[-1,[[17,[3,12]]],[[30,[29]]]],[1,[[17,[3,31]]]],[1,[[17,[11]]]],[1,2],[[-1,-2],32,[33,34],35],[[],[[22,[36]]]],[3,7],[3,7],[[3,-1],12,37],0,0,0,[[[39,[38]]],[[17,[40,41]]]],[3,[[22,[[42,[1]]]]]],[3,[[22,[1]]]],0,[[3,[44,[43]]],1],[[3,[45,[43]]],1],[[3,46],1],[[3,[47,[43]]],1],[7,12],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[3,[[17,[[48,[12]],49]]]],[3,[[17,[[48,[12]],49]]]],[-1,[[51,[50]]],[]],[3,50],[11,7],[3,7],[[3,1],[[17,[3,31]]]],[29,8],[[3,3],[[22,[50]]]],0,0,[[1,11],11],[[],52],[1,2],[3,53],[1,[[17,[3,31]]]],[[1,-1],[[17,[3,31]]],54],[[3,3],[[22,[13]]]],[3,[[22,[1]]]],[3,1],[3,[[22,[[56,[55]]]]]],[3,[[17,[57,12]]]],[3,[[22,[58]]]],[3,[[22,[58]]]],[3,[[22,[1]]]],[3,59],[3,[[61,[60]]]],0,0,0,0,[3,1],[[3,-1],17,62],[[3,-1],17,62],[[3,[22,[1]]],12],[[3,[22,[1]]],[[17,[12,31]]]],[[3,63],[[17,[12,12]]]],[[3,[22,[1]]],[[17,[12,12]]]],[[3,1],12],[[3,[22,[58]]],[[17,[12,12]]]],[[3,[22,[1]]],12],[[3,1],[[17,[12,12]]]],[[3,1],[[17,[12,12]]]],0,[[3,-1],[[17,[[66,[64,65]],67]]],68],0,[3,[[17,[2,12]]]],[3,[[17,[67]]]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,50,[]],[-1,50,[]],[-1,[[17,[-2]]],[],[]],[1,[[17,[3]]]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[1,[[17,[11]]]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,69,[]],[-1,69,[]],[-1,69,[]],[-1,69,[]],[-1,69,[]],[-1,69,[]],[[25,27],[[17,[12,28]]]],[[25,27],[[17,[12,28]]]],[3,1],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[[3,32,32],12],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[-1,70,[]],[[[71,[-1,-2]],1,-3],[[17,[[71,[-1,-2]],72]]],[73,74],[],[73,74,68]],[72,[[22,[75]]]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[72,[[22,[70]]]],[72,72],[76,76],[77,77],[[-1,-2],12,[],[]],[[-1,-2],12,[],[]],[[-1,-2],12,[],[]],[[],77],[[[71,[-1,-2]],1,-3],[[17,[[71,[-1,-2]],72]]],[73,74,78],[],[73,74,68]],[72,1],[[[71,[-1,-2]]],1,[],[]],0,[-1,[[17,[76]]],21],[-1,[[17,[77]]],21],[[[71,[-1,-2]]],79,[],[]],[[76,76],7],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[72,23],26],[[72,23],26],[[76,23],26],[[77,23],26],[[[71,[-1,-2]],23],26,[],[]],0,[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,[[17,[[71,[-2,-3]],72]]],[[30,[29]]],[],[]],[[[71,[-1,-2]],1,-3],[[17,[[71,[-1,-2]],72]]],[73,74,80],[],[73,74,68]],0,0,0,0,[[[71,[-1,-2]],81,-1],40,[],[]],0,0,[[[71,[-1,-2]],1],[[82,[-1,-2]]],[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[[[71,[-1,-2]]],[],[],[]],[[[71,[-1,-2]]],[],[],[]],[[[71,[-1,-2]],-3],[[71,[-1,-4]]],[73,74],[73,74],[10,73,74,68],[]],[[[71,[-1,-2]],1,-3],[[17,[[71,[-1,-2]],72]]],[73,74,80],[],[73,74,68]],0,[-1,[[17,[[71,[-2,-3]],72]]],[[83,[8]]],[],[]],[[[84,[-1,-2]]],22,[],[]],0,0,0,0,[[[71,[-1,-2]],1,-3],[[17,[[71,[-1,-2]],72]]],[73,74,78],[],[73,74,68]],[[[71,[-1,-2]],1,-3],[[17,[[71,[-1,-2]],72]]],[73,74,78],[],[73,74,68]],0,[[[71,[-1,-2]]],[[0,[85]]],[],[]],[[76,-1],17,62],[[77,-1],17,62],[[[71,[-1,-2]],1,-3],[[17,[[71,[-1,-2]],72]]],[73,74],[73,86],[73,74,68]],[72,[[22,[70]]]],0,[[[71,[-1,-2]],1,-3],[[17,[[71,[-1,-2]],72]]],[73,74],[73,86],[73,74,68]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,50,[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,69,[]],[-1,69,[]],[-1,69,[]],[-1,69,[]],[-1,69,[]],[[[71,[-1,-2]]],76,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[[[71,[-1,-2]],-3],[[71,[-1,-2]]],[73,74],[],[73,74,68]],[[[71,[-1,-2]],2],[[71,[-1,-2]]],[],[]],[[[71,[-1,-2]],87],[[71,[-1,-2]]],[],[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[-1,[[90,[[89,[88,65]]]]],[]],0,[-1,70,[]],[91,[[22,[75]]]],[[-1,[92,[-2]]],[[90,[[89,[88,65]]]]],[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[91,[[22,[70]]]],[91,91],[93,93],[94,94],[[-1,-2],12,[],[]],[[-1,-2],12,[],[]],[[-1,-2],12,[],[]],[[[95,[-1,-3,-2]]],[],[73,74],[73,74],[[96,[-2]]]],[[[95,[-1,-3,-2]]],[],[73,74],[73,74],[[96,[-2]]]],[91,1],[-1,[[17,[93]]],21],[-1,[[17,[94]]],21],0,[[[95,[-1,-3,-2]]],12,[73,74],[73,74],[[96,[-2]]]],[[93,93],7],[[94,94],7],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[91,23],26],[[91,23],26],[[93,23],26],[[94,23],26],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[[[97,[-1,-2]],81,-1],93,[73,74],[]],[-1,[[66,[98,65]]],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[[[97,[-1,-3]],1,-4],[[17,[[95,[-1,-3,-2]],91]]],[73,74],[73,74],[[96,[-2]]],[[83,[8]]]],[[[97,[-1,-2]],81,-1,1],[[22,[40]]],[73,74],[]],0,0,[[[97,[-1,-3]],1,[71,[-1,-2]]],[[17,[[97,[-1,-3]],91]]],[73,74],[73,74],[[96,[-2]]]],[[93,-1],17,62],[[94,-1],17,62],[[[97,[-1,-2]],-3],[[99,[12]]],[73,74],100,[[101,[[20,[[97,[-1,-2]]]]]]]],[91,[[22,[70]]]],[93,102],0,[-1,[[17,[67]]],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,50,[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,69,[]],[-1,69,[]],[-1,69,[]],[-1,69,[]],[-1,69,[]],[[[97,[-1,-2]]],94,[73,74],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,[[97,[-1,-2]]],[73,74],[]],[[[97,[-1,-2]],87],[[97,[-1,-2]]],[73,74],[]],0,0,0,[-1,70,[]],[103,[[22,[75]]]],[-1,-2,[],[]],[-1,-2,[],[]],[[102,50],-1,[]],[[102,50],103],[103,[[22,[70]]]],[103,103],[[-1,-2],12,[],[]],[103,1],[-1,[[17,[103]]],21],[[103,103],7],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[103,23],26],[[103,23],26],[-1,-1,[]],[104,103],[[[105,[-1]]],103,86],[[[106,[-1]]],103,86],[67,103],[16,103],[16,-1,[]],[67,-1,[]],[104,-1,[]],[[[106,[-1]]],-2,86,[]],[41,-1,[]],[[[105,[-1]]],-2,86,[]],[-1,-2,[],[]],[-1,41,[]],0,[[103,-1],17,62],[103,[[22,[70]]]],[-1,102,[]],[103,102],0,[-1,-2,[],[]],[-1,50,[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,69,[]],[-1,-2,[],[]],0,0,0,0,0,0,0,0,[-1,-2,[],[]],[-1,-2,[],[]],[107,107],[[-1,-2],12,[],[]],[[],107],[-1,[[17,[107]]],21],[[107,107],7],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[107,23],26],[-1,-1,[]],[-1,-2,[],[]],[[107,-1],17,62],[-1,102,[]],[107,102],[-1,-2,[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,69,[]],[-1,-2,[],[]],0,0,0,0,0,0,0,0,[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[108,108],[[-1,-2],12,[],[]],[[],108],[[108,108],7],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[108,23],26],[[108,23],26],[-1,-1,[]],[-1,-1,[]],[109,108],[1,[[17,[108]]]],[[],108],[-1,-2,[],[]],[-1,-2,[],[]],[108,7],[108,7],[[],108],[[],108],[[],108],[[-1,-2],[[90,[[89,[88]]]]],[],[73,110]],[[],108],[-1,-2,[],[]],[-1,50,[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,69,[]],[-1,69,[]],[-1,-2,[],[]],[-1,-2,[],[]],[[-1,-2],[[90,[[89,[88]]]]],[],[73,110]],0,0,[-1,[[17,[50]]],[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[81,[[17,[111,104]]]],[112,[[17,[-1,104]]],[[114,[113]]]],[112,[[17,[7,104]]]],[-1,70,[]],[112,[[17,[-1,104]]],[[114,[115]]]],[112,[[17,[1,104]]]],[112,[[17,[113,104]]]],[104,[[22,[75]]]],[[81,-1],[[17,[-2,104]]],[34,86],[[114,[113]]]],[81,[[17,[-1,104]]],116],[81,[[66,[117]]]],[81,[[17,[-1,104]]],116],[[81,-1],[[17,[7,104]]],[34,86]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[104,[[22,[70]]]],[104,104],[81,81],[112,112],[118,118],[119,119],[[-1,-2],12,[],[]],[[-1,-2],12,[],[]],[[-1,-2],12,[],[]],[[-1,-2],12,[],[]],[[-1,-2],12,[],[]],[104,1],[-1,[[17,[104]]],21],[-1,[[17,[118]]],21],[[112,112],7],[[118,118],7],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[104,23],26],[[104,23],26],[[81,23],26],[[112,23],26],[[118,23],[[17,[12,24]]]],[[118,23],26],[[119,23],26],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[1,[[17,[118]]]],[81,120],[[81,-1],[[17,[-2,104]]],[34,86],[[114,[115]]]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[81,108],0,[[[39,[-1]],119],[[17,[[22,[112]],104]]],[]],[[81,-1],[[17,[[22,[-2]],104]]],[34,86],[[114,[113]]]],[[81,-1],[[17,[[22,[7]],104]]],[34,86]],[[81,-1],[[17,[[22,[-2]],104]]],[34,86],[[114,[115]]]],[[81,-1],[[22,[112]]],[34,86]],[[81,-1],[[17,[[22,[1]],104]]],[34,86]],[[81,-1],[[17,[[22,[113]],104]]],[34,86]],[[81,-1],[[17,[112,104]]],[34,86]],[112,118],0,[[1,119],[[17,[112,104]]]],[81,[[22,[1]]]],[[104,-1],17,62],[[118,-1],17,62],[104,[[22,[70]]]],[[81,-1],[[17,[1,104]]],[34,86]],[[81,-1],[[17,[113,104]]],[34,86]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,50,[]],[-1,50,[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[1,[[17,[118]]]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,69,[]],[-1,69,[]],[-1,69,[]],[-1,69,[]],[-1,69,[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[-1,70,[]],[121,[[22,[75]]]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[121,[[22,[70]]]],[121,121],[[-1,-2],12,[],[]],[121,1],[[[82,[-1,-2]]],79,[],[]],[[[106,[-1]],23],26,86],[[[82,[-1,-2]],23],26,[],[]],[[121,23],26],[[121,23],26],[-1,-1,[]],[104,[[106,[-1]]],[]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[[[82,[-1,-2]]],7,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[[[106,[-1]],-2],[[106,[-3]]],[],68,[]],[[[82,[-1,-2]],-3],[[82,[-1,-4]]],[73,74],[73,74],[73,74,68],[]],[[[82,[-1,-2]]],108,[],[]],[[[82,[-1,-2]]],50,[],[]],[[50,8,[20,[77]]],[[17,[[82,[-1,-2]],121]]],[],[]],[[[82,[-1,-2]]],[[14,[119]]],[],[]],[[[82,[-1,-2]]],[[0,[85]]],[],[]],[121,[[22,[70]]]],[[[106,[-1]]],102,[]],[-1,-2,[],[]],[-1,50,[]],[-1,50,[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,69,[]],[-1,69,[]],[-1,69,[]],[-1,69,[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],0,0,0,0,0,0,0,0,0,0,0,[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[[[105,[-1]]],122,[]],[[[123,[-1,-2,-3]]],12,34,[],[]],[[[105,[-1]],23],26,86],[[[105,[-1]],23],26,124],[-1,-1,[]],[-1,-1,[]],[104,[[105,[-1]]],[]],[125,[[105,[-1]]],[]],[126,[[105,[-1]]],[]],[49,[[105,[-1]]],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[[[105,[-1]],-2],[[105,[-3]]],[],68,[]],[[[90,[[123,[-1,-2,-3]]]],127],[[128,[[17,[12]]]]],[129,34],[],[]],[[[90,[[123,[-1,-2,-3]]]],127],[[128,[[17,[12]]]]],[129,34],[],[]],[[[90,[[123,[-1,-2,-3]]]],127],[[128,[22]]],34,116,[]],[[[90,[[123,[-1,-2,-3]]]],127],[[128,[[17,[12]]]]],[129,34],[],[]],[[[90,[[123,[-1,-2,-3]]]],-1],[[17,[12]]],[129,34],[],[]],[[[105,[-1]]],102,[]],[-1,50,[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[[[90,[-1]],127],[[128,[[22,[17]]]]],[]],[-1,69,[]],[-1,69,[]],[-1,-2,[],[]],[-1,-2,[],[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[-1,70,[]],[130,[[22,[75]]]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[102,1],[130,[[22,[70]]]],[102,102],[130,130],[[-1,-2],12,[],[]],[[-1,-2],12,[],[]],[130,1],[-1,[[17,[102]]],21],[[102,131],7],[[102,102],7],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[-1,-2],7,[],[]],[[102,23],26],[[102,23],26],[[130,23],26],[[130,23],26],[131,102],[-1,-1,[]],[-1,-1,[]],[132,[[22,[102]]]],[32,[[22,[102]]]],[[-1,-2],32,[33,34],35],[[102,-1],12,37],[-1,-2,[],[]],[-1,-2,[],[]],[102,7],[102,7],[102,7],[102,7],[102,7],[[102,-1],17,62],[130,[[22,[70]]]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,50,[]],[-1,50,[]],[-1,[[17,[-2]]],[],[]],[58,[[17,[102]]]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,[[17,[-2]]],[],[]],[-1,69,[]],[-1,69,[]],[-1,-2,[],[]],[-1,-2,[],[]]],"c":[139],"p":[[15,"str"],[3,"PathBuf",967],[3,"Url",0],[4,"DiscoKey",0],[4,"HealthStatus",0],[3,"Command",968],[15,"bool"],[4,"Value",969],[3,"ServerState",0],[8,"Clone",970],[4,"UrlSegment",0],[15,"tuple"],[4,"Ordering",971],[15,"slice"],[3,"Config",972],[4,"ConfigError",973],[4,"Result",974],[15,"usize"],[3,"Router",975],[3,"Arc",976],[8,"Deserializer",977],[4,"Option",978],[3,"Formatter",979],[3,"Error",979],[3,"DiscoArgs",0],[6,"Result",979],[3,"ArgMatches",980],[6,"Error",981],[3,"Path",967],[8,"AsRef",982],[4,"ParseError",983],[15,"u64"],[8,"Hash",984],[8,"Sized",985],[8,"BuildHasher",984],[3,"Id",986],[8,"Hasher",984],[6,"AppServerState",0],[3,"Request",987],[3,"Response",988],[3,"Error",989],[4,"Host",990],[4,"Position",991],[3,"Range",992],[3,"RangeTo",992],[3,"RangeFull",992],[3,"RangeFrom",992],[3,"Request",993],[4,"Error",994],[3,"String",995],[4,"Resettable",996],[3,"ParseOptions",997],[4,"Origin",998],[8,"IntoIterator",999],[15,"char"],[3,"Split",1000],[3,"PathSegmentsMut",1001],[15,"u16"],[3,"Parse",1002],[3,"UrlQuery",997],[3,"Serializer",1002],[8,"Serializer",1003],[4,"IpAddr",1004],[4,"SocketAddr",1005],[3,"Global",1006],[3,"Vec",1007],[3,"Error",1008],[8,"Fn",1009],[3,"TypeId",1010],[8,"Error",1011],[3,"Api",220],[4,"ApiError",220],[8,"Send",985],[8,"Sync",985],[3,"Backtrace",1012],[3,"ApiVersion",220],[3,"ApiMetadata",220],[8,"WriteState",530],[6,"Html",0],[8,"ReadState",530],[3,"RequestParams",579],[3,"Route",727],[8,"Into",982],[3,"RoutesWithPath",220],[8,"Iterator",1013],[8,"Display",979],[3,"Version",1014],[8,"Future",1015],[3,"Box",1016],[3,"Pin",1017],[4,"AppError",353],[3,"Server",1018],[3,"AppHealth",353],[3,"AppVersion",353],[3,"Module",353],[8,"From",982],[3,"App",353],[3,"ListenInfo",1019],[6,"Result",1008],[8,"Error",456],[8,"ToListener",353],[4,"StatusCode",854],[3,"ServerError",456],[4,"RequestError",579],[4,"SocketError",808],[4,"RouteError",727],[4,"HealthStatus",501],[4,"Method",530],[4,"Method",1020],[8,"FnOnce",1009],[3,"Accept",1021],[4,"RequestParamValue",579],[3,"TaggedBase64",1022],[8,"TryFrom",982],[15,"u128"],[8,"DeserializeOwned",977],[15,"u8"],[4,"RequestParamType",579],[3,"RequestParam",579],[3,"Headers",1023],[4,"RouteParseError",727],[4,"CloseCode",1024],[3,"Connection",808],[8,"Debug",979],[3,"Error",1025],[6,"Error",1026],[3,"Context",1027],[4,"Poll",1028],[8,"Serialize",1003],[3,"OutOfRangeError",854],[4,"StatusCode",1029],[15,"i64"],[6,"AppState",0],[13,"IncorrectMethod",346],[13,"CannotReadToml",346],[13,"AmbiguousRoutes",346],[13,"Route",346],[13,"InvalidMetaTable",346],[8,"Listener",353],[13,"Api",455],[8,"HealthCheck",501],[3,"ParseMethodError",530],[8,"Metrics",576],[13,"IncorrectParamType",716],[13,"TagMismatch",716],[13,"IntegerOverflow",716],[13,"MissingParam",716],[13,"InvalidParam",716],[13,"TaggedBase64",716],[13,"Http",716],[3,"MapErr",727],[13,"IncorrectMethod",807],[13,"IncorrectMethod",852]]}\
}');
if (typeof window !== 'undefined' && window.initSearch) {window.initSearch(searchIndex)};
if (typeof exports !== 'undefined') {exports.searchIndex = searchIndex};
diff --git a/src-files.js b/src-files.js
index 83599fd2..c2675f34 100644
--- a/src-files.js
+++ b/src-files.js
@@ -1,4 +1,4 @@
var srcIndex = JSON.parse('{\
-"tide_disco":["",[],["api.rs","app.rs","error.rs","healthcheck.rs","lib.rs","method.rs","metrics.rs","request.rs","route.rs","socket.rs"]]\
+"tide_disco":["",[],["api.rs","app.rs","error.rs","healthcheck.rs","lib.rs","method.rs","metrics.rs","request.rs","route.rs","socket.rs","status.rs"]]\
}');
createSrcSidebar();
diff --git a/src/tide_disco/app.rs.html b/src/tide_disco/app.rs.html
index b8463ebb..ffc20c9e 100644
--- a/src/tide_disco/app.rs.html
+++ b/src/tide_disco/app.rs.html
@@ -885,7 +885,6 @@
885886887
-888
// Copyright (c) 2022 Espresso Systems (espressosys.com)
// This file is part of the tide-disco library.
@@ -900,7 +899,7 @@
request::{best_response_type, RequestParam, RequestParams},
route::{self, health_check_response, respond_with, Handler, Route, RouteError},
socket::SocketError,
- Html,
+ Html, StatusCode,
};
use async_std::sync::Arc;
use futures::future::{BoxFuture, FutureExt};
@@ -921,7 +920,6 @@
use tide::{
http::{headers::HeaderValue, mime},
security::{CorsMiddleware, Origin},
- StatusCode,
};
use tide_websockets::WebSocket;
@@ -1054,7 +1052,7 @@
let mut modules = HashMap::new();
let mut status = HealthStatus::Available;
for (name, api) in &self.apis {
- let health = api.health(req.clone(), state).await.status();
+ let health = StatusCode::from(api.health(req.clone(), state).await.status());
if health != StatusCode::Ok {
status = HealthStatus::Unhealthy;
}
diff --git a/src/tide_disco/error.rs.html b/src/tide_disco/error.rs.html
index 27ef3c6a..03132508 100644
--- a/src/tide_disco/error.rs.html
+++ b/src/tide_disco/error.rs.html
@@ -109,39 +109,18 @@
109110111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
// Copyright (c) 2022 Espresso Systems (espressosys.com)
// This file is part of the tide-disco library.
// You should have received a copy of the MIT License
// along with the tide-disco library. If not, see <https://mit-license.org/>.
-use crate::{request::RequestError, route::RouteError, socket::SocketError};
+use crate::{request::RequestError, route::RouteError, socket::SocketError, StatusCode};
use config::ConfigError;
use serde::{de::DeserializeOwned, Deserialize, Serialize};
use snafu::Snafu;
use std::fmt::Display;
use std::io::Error as IoError;
-use tide::StatusCode;
/// Errors which can be serialized in a response body.
///
@@ -185,7 +164,7 @@
fn from_server_error(source: tide::Error) -> Self {
match source.downcast::<Self>() {
Ok(err) => err,
- Err(source) => Self::catch_all(source.status(), source.to_string()),
+ Err(source) => Self::catch_all(source.status().into(), source.to_string()),
}
}
}
@@ -198,29 +177,10 @@
#[derive(Clone, Debug, Snafu, Serialize, Deserialize, PartialEq, Eq)]
#[snafu(display("Error {}: {}", status, message))]
pub struct ServerError {
- #[serde(with = "ser_status")]
- pub status: StatusCode,
+ pub status: StatusCode,
pub message: String,
}
-mod ser_status {
- //! The deserialization implementation for [StatusCode] uses `deserialize_any` unnecessarily,
- //! which prevents it from working with [bincode].
- use super::*;
- use serde::{
- de::{Deserializer, Error},
- ser::Serializer,
- };
-
- pub fn serialize<S: Serializer>(status: &StatusCode, s: S) -> Result<S::Ok, S::Error> {
- u16::from(*status).serialize(s)
- }
-
- pub fn deserialize<'de, D: Deserializer<'de>>(d: D) -> Result<StatusCode, D::Error> {
- u16::deserialize(d)?.try_into().map_err(D::Error::custom)
- }
-}
-
impl Error for ServerError {
fn catch_all(status: StatusCode, message: String) -> Self {
Self { status, message }
diff --git a/src/tide_disco/healthcheck.rs.html b/src/tide_disco/healthcheck.rs.html
index 28fa738d..ff325f0b 100644
--- a/src/tide_disco/healthcheck.rs.html
+++ b/src/tide_disco/healthcheck.rs.html
@@ -61,8 +61,8 @@
// You should have received a copy of the MIT License
// along with the tide-disco library. If not, see <https://mit-license.org/>.
-use serde::{Deserialize, Serialize};
-use tide::StatusCode;
+use crate::StatusCode;
+use serde::{Deserialize, Serialize};
/// A response to a healthcheck endpoint.
///
diff --git a/src/tide_disco/lib.rs.html b/src/tide_disco/lib.rs.html
index 12bcf8e4..ae3c1dd5 100644
--- a/src/tide_disco/lib.rs.html
+++ b/src/tide_disco/lib.rs.html
@@ -676,6 +676,8 @@
676677678
+679
+680
// Copyright (c) 2022 Espresso Systems (espressosys.com)
// This file is part of the tide-disco library.
@@ -951,13 +953,15 @@
pub mod request;
pub mod route;
pub mod socket;
+pub mod status;
pub use api::Api;
pub use app::App;
pub use error::Error;
pub use method::Method;
pub use request::{RequestError, RequestParam, RequestParamType, RequestParamValue, RequestParams};
-pub use tide::http::{self, StatusCode};
+pub use status::StatusCode;
+pub use tide::http;
pub use url::Url;
pub type Html = maud::Markup;
diff --git a/src/tide_disco/route.rs.html b/src/tide_disco/route.rs.html
index ebdd9cf9..bc6d9a25 100644
--- a/src/tide_disco/route.rs.html
+++ b/src/tide_disco/route.rs.html
@@ -654,7 +654,6 @@
654655656
-657
// Copyright (c) 2022 Espresso Systems (espressosys.com)
// This file is part of the tide-disco library.
@@ -668,7 +667,7 @@
metrics,
request::{best_response_type, RequestError, RequestParam, RequestParamType, RequestParams},
socket::{self, SocketError},
- Html,
+ Html, StatusCode,
};
use async_std::sync::Arc;
use async_trait::async_trait;
@@ -689,7 +688,6 @@
self,
content::Accept,
mime::{self, Mime},
- StatusCode,
},
Body,
};
diff --git a/src/tide_disco/socket.rs.html b/src/tide_disco/socket.rs.html
index 32a922dd..0d5d8449 100644
--- a/src/tide_disco/socket.rs.html
+++ b/src/tide_disco/socket.rs.html
@@ -403,6 +403,7 @@
403404405
+406
// Copyright (c) 2022 Espresso Systems (espressosys.com)
// This file is part of the tide-disco library.
@@ -412,9 +413,10 @@
//! An interface for asynchronous communication with clients, using WebSockets.
use crate::{
- http::{content::Accept, mime, StatusCode},
+ http::{content::Accept, mime},
method::Method,
request::{best_response_type, RequestError, RequestParams},
+ StatusCode,
};
use async_std::sync::Arc;
use futures::{
diff --git a/src/tide_disco/status.rs.html b/src/tide_disco/status.rs.html
new file mode 100644
index 00000000..2444b490
--- /dev/null
+++ b/src/tide_disco/status.rs.html
@@ -0,0 +1,1177 @@
+status.rs - source
// Copyright (c) 2022 Espresso Systems (espressosys.com)
+// This file is part of the tide-disco library.
+
+// You should have received a copy of the MIT License
+// along with the tide-disco library. If not, see <https://mit-license.org/>.
+
+use num_derive::FromPrimitive;
+use num_traits::FromPrimitive;
+use serde::{Deserialize, Serialize};
+use snafu::{OptionExt, Snafu};
+use std::fmt::{self, Display, Formatter};
+
+/// Serializable HTTP status code.
+///
+/// The deserialization implementation for [StatusCode] uses `deserialize_any` unnecessarily,
+/// which prevents it from working with [bincode]. We define our own version without this problem.
+#[repr(u16)]
+#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Deserialize, Serialize, FromPrimitive)]
+#[serde(try_from = "u16", into = "u16")]
+pub enum StatusCode {
+ /// 100 Continue
+ ///
+ /// This interim response indicates that everything so far is OK and that
+ /// the client should continue the request, or ignore the response if
+ /// the request is already finished.
+ Continue = 100,
+
+ /// 101 Switching Protocols
+ ///
+ /// This code is sent in response to an Upgrade request header from the
+ /// client, and indicates the protocol the server is switching to.
+ SwitchingProtocols = 101,
+
+ /// 103 Early Hints
+ ///
+ /// This status code is primarily intended to be used with the Link header,
+ /// letting the user agent start preloading resources while the server
+ /// prepares a response.
+ EarlyHints = 103,
+
+ /// 200 Ok
+ ///
+ /// The request has succeeded
+ Ok = 200,
+
+ /// 201 Created
+ ///
+ /// The request has succeeded and a new resource has been created as a
+ /// result. This is typically the response sent after POST requests, or
+ /// some PUT requests.
+ Created = 201,
+
+ /// 202 Accepted
+ ///
+ /// The request has been received but not yet acted upon. It is
+ /// noncommittal, since there is no way in HTTP to later send an
+ /// asynchronous response indicating the outcome of the request. It is
+ /// intended for cases where another process or server handles the request,
+ /// or for batch processing.
+ Accepted = 202,
+
+ /// 203 Non Authoritative Information
+ ///
+ /// This response code means the returned meta-information is not exactly
+ /// the same as is available from the origin server, but is collected
+ /// from a local or a third-party copy. This is mostly used for mirrors
+ /// or backups of another resource. Except for that specific case, the
+ /// "200 OK" response is preferred to this status.
+ NonAuthoritativeInformation = 203,
+
+ /// 204 No Content
+ ///
+ /// There is no content to send for this request, but the headers may be
+ /// useful. The user-agent may update its cached headers for this
+ /// resource with the new ones.
+ NoContent = 204,
+
+ /// 205 Reset Content
+ ///
+ /// Tells the user-agent to reset the document which sent this request.
+ ResetContent = 205,
+
+ /// 206 Partial Content
+ ///
+ /// This response code is used when the Range header is sent from the client
+ /// to request only part of a resource.
+ PartialContent = 206,
+
+ /// 207 Multi-Status
+ ///
+ /// A Multi-Status response conveys information about
+ /// multiple resources in situations where multiple
+ /// status codes might be appropriate.
+ MultiStatus = 207,
+
+ /// 226 Im Used
+ ///
+ /// The server has fulfilled a GET request for the resource, and the
+ /// response is a representation of the result of one or more
+ /// instance-manipulations applied to the current instance.
+ ImUsed = 226,
+
+ /// 300 Multiple Choice
+ ///
+ /// The request has more than one possible response. The user-agent or user
+ /// should choose one of them. (There is no standardized way of choosing
+ /// one of the responses, but HTML links to the possibilities are
+ /// recommended so the user can pick.)
+ MultipleChoice = 300,
+
+ /// 301 Moved Permanently
+ ///
+ /// The URL of the requested resource has been changed permanently. The new
+ /// URL is given in the response.
+ MovedPermanently = 301,
+
+ /// 302 Found
+ ///
+ /// This response code means that the URI of requested resource has been
+ /// changed temporarily. Further changes in the URI might be made in the
+ /// future. Therefore, this same URI should be used by the client in
+ /// future requests.
+ Found = 302,
+
+ /// 303 See Other
+ ///
+ /// The server sent this response to direct the client to get the requested
+ /// resource at another URI with a GET request.
+ SeeOther = 303,
+
+ /// 304 Not Modified
+ ///
+ /// This is used for caching purposes. It tells the client that the response
+ /// has not been modified, so the client can continue to use the same
+ /// cached version of the response.
+ NotModified = 304,
+
+ /// 307 Temporary Redirect
+ ///
+ /// The server sends this response to direct the client to get the requested
+ /// resource at another URI with same method that was used in the prior
+ /// request. This has the same semantics as the 302 Found HTTP response
+ /// code, with the exception that the user agent must not change the
+ /// HTTP method used: If a POST was used in the first request, a POST must
+ /// be used in the second request.
+ TemporaryRedirect = 307,
+
+ /// 308 Permanent Redirect
+ ///
+ /// This means that the resource is now permanently located at another URI,
+ /// specified by the Location: HTTP Response header. This has the same
+ /// semantics as the 301 Moved Permanently HTTP response code, with the
+ /// exception that the user agent must not change the HTTP method
+ /// used: If a POST was used in the first request, a POST must be used in
+ /// the second request.
+ PermanentRedirect = 308,
+
+ /// 400 Bad Request
+ ///
+ /// The server could not understand the request due to invalid syntax.
+ BadRequest = 400,
+
+ /// 401 Unauthorized
+ ///
+ /// Although the HTTP standard specifies "unauthorized", semantically this
+ /// response means "unauthenticated". That is, the client must
+ /// authenticate itself to get the requested response.
+ Unauthorized = 401,
+
+ /// 402 Payment Required
+ ///
+ /// This response code is reserved for future use. The initial aim for
+ /// creating this code was using it for digital payment systems, however
+ /// this status code is used very rarely and no standard convention
+ /// exists.
+ PaymentRequired = 402,
+
+ /// 403 Forbidden
+ ///
+ /// The client does not have access rights to the content; that is, it is
+ /// unauthorized, so the server is refusing to give the requested
+ /// resource. Unlike 401, the client's identity is known to the server.
+ Forbidden = 403,
+
+ /// 404 Not Found
+ ///
+ /// The server can not find requested resource. In the browser, this means
+ /// the URL is not recognized. In an API, this can also mean that the
+ /// endpoint is valid but the resource itself does not exist. Servers
+ /// may also send this response instead of 403 to hide the existence of
+ /// a resource from an unauthorized client. This response code is probably
+ /// the most famous one due to its frequent occurrence on the web.
+ NotFound = 404,
+
+ /// 405 Method Not Allowed
+ ///
+ /// The request method is known by the server but has been disabled and
+ /// cannot be used. For example, an API may forbid DELETE-ing a
+ /// resource. The two mandatory methods, GET and HEAD, must never be
+ /// disabled and should not return this error code.
+ MethodNotAllowed = 405,
+
+ /// 406 Not Acceptable
+ ///
+ /// This response is sent when the web server, after performing
+ /// server-driven content negotiation, doesn't find any content that
+ /// conforms to the criteria given by the user agent.
+ NotAcceptable = 406,
+
+ /// 407 Proxy Authentication Required
+ ///
+ /// This is similar to 401 but authentication is needed to be done by a
+ /// proxy.
+ ProxyAuthenticationRequired = 407,
+
+ /// 408 Request Timeout
+ ///
+ /// This response is sent on an idle connection by some servers, even
+ /// without any previous request by the client. It means that the server
+ /// would like to shut down this unused connection. This response is
+ /// used much more since some browsers, like Chrome, Firefox 27+,
+ /// or IE9, use HTTP pre-connection mechanisms to speed up surfing. Also
+ /// note that some servers merely shut down the connection without
+ /// sending this message.
+ RequestTimeout = 408,
+
+ /// 409 Conflict
+ ///
+ /// This response is sent when a request conflicts with the current state of
+ /// the server.
+ Conflict = 409,
+
+ /// 410 Gone
+ ///
+ /// This response is sent when the requested content has been permanently
+ /// deleted from server, with no forwarding address. Clients are
+ /// expected to remove their caches and links to the resource. The HTTP
+ /// specification intends this status code to be used for "limited-time,
+ /// promotional services". APIs should not feel compelled to indicate
+ /// resources that have been deleted with this status code.
+ Gone = 410,
+
+ /// 411 Length Required
+ ///
+ /// Server rejected the request because the Content-Length header field is
+ /// not defined and the server requires it.
+ LengthRequired = 411,
+
+ /// 412 Precondition Failed
+ ///
+ /// The client has indicated preconditions in its headers which the server
+ /// does not meet.
+ PreconditionFailed = 412,
+
+ /// 413 Payload Too Large
+ ///
+ /// Request entity is larger than limits defined by server; the server might
+ /// close the connection or return an Retry-After header field.
+ PayloadTooLarge = 413,
+
+ /// 414 URI Too Long
+ ///
+ /// The URI requested by the client is longer than the server is willing to
+ /// interpret.
+ UriTooLong = 414,
+
+ /// 415 Unsupported Media Type
+ ///
+ /// The media format of the requested data is not supported by the server,
+ /// so the server is rejecting the request.
+ UnsupportedMediaType = 415,
+
+ /// 416 Requested Range Not Satisfiable
+ ///
+ /// The range specified by the Range header field in the request can't be
+ /// fulfilled; it's possible that the range is outside the size of the
+ /// target URI's data.
+ RequestedRangeNotSatisfiable = 416,
+
+ /// 417 Expectation Failed
+ ///
+ /// This response code means the expectation indicated by the Expect request
+ /// header field can't be met by the server.
+ ExpectationFailed = 417,
+ ///
+ /// 418 I'm a teapot
+ ///
+ /// The server refuses the attempt to brew coffee with a teapot.
+ ImATeapot = 418,
+
+ /// 421 Misdirected Request
+ ///
+ /// The request was directed at a server that is not able to produce a
+ /// response. This can be sent by a server that is not configured to
+ /// produce responses for the combination of scheme and authority that
+ /// are included in the request URI.
+ MisdirectedRequest = 421,
+
+ /// 422 Unprocessable Entity
+ ///
+ /// The request was well-formed but was unable to be followed due to
+ /// semantic errors.
+ UnprocessableEntity = 422,
+
+ /// 423 Locked
+ ///
+ /// The resource that is being accessed is locked.
+ Locked = 423,
+
+ /// 424 Failed Dependency
+ ///
+ /// The request failed because it depended on another request and that
+ /// request failed (e.g., a PROPPATCH).
+ FailedDependency = 424,
+
+ /// 425 Too Early
+ ///
+ /// Indicates that the server is unwilling to risk processing a request that
+ /// might be replayed.
+ TooEarly = 425,
+
+ /// 426 Upgrade Required
+ ///
+ /// The server refuses to perform the request using the current protocol but
+ /// might be willing to do so after the client upgrades to a different
+ /// protocol. The server sends an Upgrade header in a 426 response to
+ /// indicate the required protocol(s).
+ UpgradeRequired = 426,
+
+ /// 428 Precondition Required
+ ///
+ /// The origin server requires the request to be conditional. This response
+ /// is intended to prevent the 'lost update' problem, where a client
+ /// GETs a resource's state, modifies it, and PUTs it back to the
+ /// server, when meanwhile a third party has modified the state on the
+ /// server, leading to a conflict.
+ PreconditionRequired = 428,
+
+ /// 429 Too Many Requests
+ ///
+ /// The user has sent too many requests in a given amount of time ("rate
+ /// limiting").
+ TooManyRequests = 429,
+
+ /// 431 Request Header Fields Too Large
+ ///
+ /// The server is unwilling to process the request because its header fields
+ /// are too large. The request may be resubmitted after reducing the
+ /// size of the request header fields.
+ RequestHeaderFieldsTooLarge = 431,
+
+ /// 451 Unavailable For Legal Reasons
+ ///
+ /// The user-agent requested a resource that cannot legally be provided,
+ /// such as a web page censored by a government.
+ UnavailableForLegalReasons = 451,
+
+ /// 500 Internal Server Error
+ ///
+ /// The server has encountered a situation it doesn't know how to handle.
+ InternalServerError = 500,
+
+ /// 501 Not Implemented
+ ///
+ /// The request method is not supported by the server and cannot be handled.
+ /// The only methods that servers are required to support (and therefore
+ /// that must not return this code) are GET and HEAD.
+ NotImplemented = 501,
+
+ /// 502 Bad Gateway
+ ///
+ /// This error response means that the server, while working as a gateway to
+ /// get a response needed to handle the request, got an invalid
+ /// response.
+ BadGateway = 502,
+
+ /// 503 Service Unavailable
+ ///
+ /// The server is not ready to handle the request. Common causes are a
+ /// server that is down for maintenance or that is overloaded. Note that
+ /// together with this response, a user-friendly page explaining the
+ /// problem should be sent. This responses should be used for temporary
+ /// conditions and the Retry-After: HTTP header should, if possible, contain
+ /// the estimated time before the recovery of the service. The webmaster
+ /// must also take care about the caching-related headers that are sent
+ /// along with this response, as these temporary condition responses
+ /// should usually not be cached.
+ ServiceUnavailable = 503,
+
+ /// 504 Gateway Timeout
+ ///
+ /// This error response is given when the server is acting as a gateway and
+ /// cannot get a response in time.
+ GatewayTimeout = 504,
+
+ /// 505 HTTP Version Not Supported
+ ///
+ /// The HTTP version used in the request is not supported by the server.
+ HttpVersionNotSupported = 505,
+
+ /// 506 Variant Also Negotiates
+ ///
+ /// The server has an internal configuration error: the chosen variant
+ /// resource is configured to engage in transparent content negotiation
+ /// itself, and is therefore not a proper end point in the negotiation
+ /// process.
+ VariantAlsoNegotiates = 506,
+
+ /// 507 Insufficient Storage
+ ///
+ /// The server is unable to store the representation needed to complete the
+ /// request.
+ InsufficientStorage = 507,
+
+ /// 508 Loop Detected
+ ///
+ /// The server detected an infinite loop while processing the request.
+ LoopDetected = 508,
+
+ /// 510 Not Extended
+ ///
+ /// Further extensions to the request are required for the server to fulfil
+ /// it.
+ NotExtended = 510,
+
+ /// 511 Network Authentication Required
+ ///
+ /// The 511 status code indicates that the client needs to authenticate to
+ /// gain network access.
+ NetworkAuthenticationRequired = 511,
+}
+
+#[derive(Clone, Copy, Debug, Snafu)]
+#[snafu(display("status code out of range"))]
+pub struct OutOfRangeError;
+
+impl TryFrom<u16> for StatusCode {
+ type Error = OutOfRangeError;
+
+ fn try_from(code: u16) -> Result<Self, Self::Error> {
+ Self::from_u16(code).context(OutOfRangeSnafu)
+ }
+}
+
+impl From<StatusCode> for u16 {
+ fn from(code: StatusCode) -> Self {
+ code as u16
+ }
+}
+
+impl From<StatusCode> for tide::StatusCode {
+ fn from(code: StatusCode) -> Self {
+ // `StatusCode` and `tide::StatusCode` have the same variants, so converting from one to
+ // the other through `u16` cannot fail.
+ u16::from(code).try_into().unwrap()
+ }
+}
+
+impl From<tide::StatusCode> for StatusCode {
+ fn from(code: tide::StatusCode) -> Self {
+ // `StatusCode` and `tide::StatusCode` have the same variants, so converting from one to
+ // the other through `u16` cannot fail.
+ u16::from(code).try_into().unwrap()
+ }
+}
+
+impl PartialEq<tide::StatusCode> for StatusCode {
+ fn eq(&self, other: &tide::StatusCode) -> bool {
+ *self == Self::from(*other)
+ }
+}
+
+impl PartialEq<StatusCode> for tide::StatusCode {
+ fn eq(&self, other: &StatusCode) -> bool {
+ *self == Self::from(*other)
+ }
+}
+
+impl Display for StatusCode {
+ fn fmt(&self, f: &mut Formatter) -> fmt::Result {
+ write!(f, "{}", *self as u16)
+ }
+}
+
+impl StatusCode {
+ /// Returns `true` if the status code is `1xx` range.
+ ///
+ /// If this returns `true` it indicates that the request was received,
+ /// continuing process.
+ pub fn is_informational(self) -> bool {
+ tide::StatusCode::from(self).is_informational()
+ }
+
+ /// Returns `true` if the status code is the `2xx` range.
+ ///
+ /// If this returns `true` it indicates that the request was successfully
+ /// received, understood, and accepted.
+ pub fn is_success(self) -> bool {
+ tide::StatusCode::from(self).is_success()
+ }
+
+ /// Returns `true` if the status code is the `3xx` range.
+ ///
+ /// If this returns `true` it indicates that further action needs to be
+ /// taken in order to complete the request.
+ pub fn is_redirection(self) -> bool {
+ tide::StatusCode::from(self).is_redirection()
+ }
+
+ /// Returns `true` if the status code is the `4xx` range.
+ ///
+ /// If this returns `true` it indicates that the request contains bad syntax
+ /// or cannot be fulfilled.
+ pub fn is_client_error(self) -> bool {
+ tide::StatusCode::from(self).is_client_error()
+ }
+
+ /// Returns `true` if the status code is the `5xx` range.
+ ///
+ /// If this returns `true` it indicates that the server failed to fulfill an
+ /// apparently valid request.
+ pub fn is_server_error(self) -> bool {
+ tide::StatusCode::from(self).is_server_error()
+ }
+
+ /// The canonical reason for a given status code
+ pub fn canonical_reason(self) -> &'static str {
+ tide::StatusCode::from(self).canonical_reason()
+ }
+}
+
+#[cfg(test)]
+mod test {
+ use super::*;
+
+ #[test]
+ fn test_status_code() {
+ for code in 0u16.. {
+ // Iterate over all valid status codes, then break.
+ let Ok(status) = StatusCode::try_from(code) else {
+ break;
+ };
+ // Test type conversions.
+ assert_eq!(
+ tide::StatusCode::try_from(code).unwrap(),
+ tide::StatusCode::from(status)
+ );
+ assert_eq!(code, u16::from(status));
+
+ // Test bincode round trip.
+ assert_eq!(
+ status,
+ bincode::deserialize::<StatusCode>(&bincode::serialize(&status).unwrap()).unwrap()
+ );
+
+ // Test JSON round trip, readability, and backwards compatibility.
+ let json = serde_json::to_string(&status).unwrap();
+ assert_eq!(status, serde_json::from_str::<StatusCode>(&json).unwrap());
+ assert_eq!(json, code.to_string());
+ assert_eq!(
+ json,
+ serde_json::to_string(&tide::StatusCode::from(status)).unwrap()
+ );
+
+ // Test display.
+ assert_eq!(status.to_string(), code.to_string());
+ assert_eq!(
+ status.to_string(),
+ tide::StatusCode::from(status).to_string()
+ );
+
+ // Test equality.
+ assert_eq!(status, tide::StatusCode::from(status));
+ }
+
+ // Now iterate over all valid _Tide_ status codes, and ensure the ycan be converted to our
+ // `StatusCode`.
+ for code in 0u16.. {
+ let Ok(status) = tide::StatusCode::try_from(code) else {
+ break;
+ };
+ assert_eq!(
+ StatusCode::try_from(code).unwrap(),
+ StatusCode::from(status)
+ );
+ }
+ }
+}
+
\ No newline at end of file
diff --git a/tide_disco/all.html b/tide_disco/all.html
index 2bfdc00f..33931471 100644
--- a/tide_disco/all.html
+++ b/tide_disco/all.html
@@ -1 +1 @@
-List of all items in this crate
\ No newline at end of file
diff --git a/tide_disco/api/struct.Api.html b/tide_disco/api/struct.Api.html
index 2671ae5f..d5b7d360 100644
--- a/tide_disco/api/struct.Api.html
+++ b/tide_disco/api/struct.Api.html
@@ -396,7 +396,7 @@
Returns an iterator for traversing the chain of errors,
starting with the current error
and continuing with recursive calls to Error::source. Read more
The Listener trait represents an implementation of http transport for a tide
application. In order to provide a Listener to tide, you will also need to
implement at least one ToListener that
outputs your Listener type.
ToListener represents any type that can be converted into a
diff --git a/tide_disco/app/struct.App.html b/tide_disco/app/struct.App.html
index a6d31a29..aa45643f 100644
--- a/tide_disco/app/struct.App.html
+++ b/tide_disco/app/struct.App.html
@@ -1,24 +1,24 @@
-App in tide_disco::app - Rust
An App is a collection of API modules, plus a global State. Modules can be registered by
constructing an Api for each module and calling App::register_module. Once all of the
desired modules are registered, the app can be converted into an asynchronous server task using
App::serve.
The version information will automatically be included in responses to GET /version.
This is the version of the overall application, which may encompass several APIs, each with
their own version. Changes to the version of any of the APIs which make up this application
@@ -34,24 +34,24 @@
is contained in the application crate, it should result in a reasonable version:
Check the health of each registered module in response to a request.
+
The response includes a status code for each module, which will be StatusCode::Ok if the
module is healthy. Detailed health status from each module is not included in the response
(due to type erasure) but can be queried using module_health or by
hitting the endpoint GET /:module/healthcheck.
The resulting Response has a status code which is StatusCode::Ok if the
module is healthy. The response body is constructed from the results of the module’s
registered healthcheck handler. If the module does not have an explicit healthcheck
handler, the response will be a HealthStatus.
If there is no module with the given name, returns None.
\ No newline at end of file
diff --git a/tide_disco/constant.SERVER_STARTUP_SLEEP_MS.html b/tide_disco/constant.SERVER_STARTUP_SLEEP_MS.html
index 206fe26d..54c12df7 100644
--- a/tide_disco/constant.SERVER_STARTUP_SLEEP_MS.html
+++ b/tide_disco/constant.SERVER_STARTUP_SLEEP_MS.html
@@ -1,2 +1,2 @@
-SERVER_STARTUP_SLEEP_MS in tide_disco - Rust
\ No newline at end of file
diff --git a/tide_disco/enum.DiscoKey.html b/tide_disco/enum.DiscoKey.html
index 1599d763..aae2fc4e 100644
--- a/tide_disco/enum.DiscoKey.html
+++ b/tide_disco/enum.DiscoKey.html
@@ -1,4 +1,4 @@
-DiscoKey in tide_disco - Rust
The application is expected to define additional keys. Note, string literals could be used
directly, but defining an enum allows the compiler to catch typos.
Errors which can be serialized in a response body.
\ No newline at end of file
diff --git a/tide_disco/error/struct.ServerError.html b/tide_disco/error/struct.ServerError.html
index 9de3c65d..d1c4dbe1 100644
--- a/tide_disco/error/struct.ServerError.html
+++ b/tide_disco/error/struct.ServerError.html
@@ -1,19 +1,19 @@
-ServerError in tide_disco::error - Rust
You can use this to get up and running quickly if you don’t want to create your own error type.
However, we strongly reccommend creating a custom error type and implementing Error for it, so
that you can provide more informative and structured error responses specific to your API.
Returns an iterator for traversing the chain of errors,
starting with the current error
-and continuing with recursive calls to Error::source. Read more
For maximum effectiveness, this needs to be called as a method
to benefit from Rust’s automatic dereferencing of method
diff --git a/tide_disco/error/trait.Error.html b/tide_disco/error/trait.Error.html
index 18c56c92..d6caf663 100644
--- a/tide_disco/error/trait.Error.html
+++ b/tide_disco/error/trait.Error.html
@@ -1,7 +1,7 @@
-Error in tide_disco::error - Rust
Other errors (those which don’t downcast to the API’s error type, such as errors generated from
the [tide] framework) will be serialized as strings using their Display instance and encoded
as an API error using the catch_all function.
\ No newline at end of file
diff --git a/tide_disco/fn.app_api_path.html b/tide_disco/fn.app_api_path.html
index c477ea33..06372444 100644
--- a/tide_disco/fn.app_api_path.html
+++ b/tide_disco/fn.app_api_path.html
@@ -1 +1 @@
-app_api_path in tide_disco - Rust
\ No newline at end of file
diff --git a/tide_disco/fn.check_api.html b/tide_disco/fn.check_api.html
index 02379792..4c01ceef 100644
--- a/tide_disco/fn.check_api.html
+++ b/tide_disco/fn.check_api.html
@@ -1,4 +1,4 @@
-check_api in tide_disco - Rust
Compose the path to the application’s configuration file
\ No newline at end of file
diff --git a/tide_disco/fn.compose_settings.html b/tide_disco/fn.compose_settings.html
index 0fc118b0..200edc2b 100644
--- a/tide_disco/fn.compose_settings.html
+++ b/tide_disco/fn.compose_settings.html
@@ -1,4 +1,4 @@
-compose_settings in tide_disco - Rust
Add routes from api.toml to the routefinder instance in tide-disco
\ No newline at end of file
diff --git a/tide_disco/fn.get_api_path.html b/tide_disco/fn.get_api_path.html
index d0574905..91d34356 100644
--- a/tide_disco/fn.get_api_path.html
+++ b/tide_disco/fn.get_api_path.html
@@ -1,2 +1,2 @@
-get_api_path in tide_disco - Rust
\ No newline at end of file
diff --git a/tide_disco/fn.healthcheck.html b/tide_disco/fn.healthcheck.html
index fcf6ca32..825ceab7 100644
--- a/tide_disco/fn.healthcheck.html
+++ b/tide_disco/fn.healthcheck.html
@@ -1,4 +1,4 @@
-healthcheck in tide_disco - Rust
Return a JSON expression with status 200 indicating the server
is up and running. The JSON expression is normally
diff --git a/tide_disco/fn.init_logging.html b/tide_disco/fn.init_logging.html
index a324197f..8ff58f4b 100644
--- a/tide_disco/fn.init_logging.html
+++ b/tide_disco/fn.init_logging.html
@@ -1 +1 @@
-
\ No newline at end of file
diff --git a/tide_disco/fn.load_api.html b/tide_disco/fn.load_api.html
index ab9acfd8..ccaa8690 100644
--- a/tide_disco/fn.load_api.html
+++ b/tide_disco/fn.load_api.html
@@ -1,2 +1,2 @@
-load_api in tide_disco - Rust
\ No newline at end of file
diff --git a/tide_disco/fn.org_data_path.html b/tide_disco/fn.org_data_path.html
index cbec9c31..31d9f546 100644
--- a/tide_disco/fn.org_data_path.html
+++ b/tide_disco/fn.org_data_path.html
@@ -1 +1 @@
-org_data_path in tide_disco - Rust
\ No newline at end of file
diff --git a/tide_disco/fn.wait_for_server.html b/tide_disco/fn.wait_for_server.html
index 0f9e2b38..efdec47c 100644
--- a/tide_disco/fn.wait_for_server.html
+++ b/tide_disco/fn.wait_for_server.html
@@ -1,4 +1,4 @@
-wait_for_server in tide_disco - Rust
Wait for the server to respond to a connection request
This is useful for tests for which it doesn’t make sense to send requests until the server has
started.
\ No newline at end of file
diff --git a/tide_disco/healthcheck/enum.HealthStatus.html b/tide_disco/healthcheck/enum.HealthStatus.html
index 31c57b47..2cf50f91 100644
--- a/tide_disco/healthcheck/enum.HealthStatus.html
+++ b/tide_disco/healthcheck/enum.HealthStatus.html
@@ -7,7 +7,7 @@
ShuttingDown,
}Expand description
A type implementing HealthCheck may be returned from a healthcheck endpoint itself (via its
Serialize implementation) as well as incorporated automatically into the global healthcheck
@@ -10,7 +10,7 @@
application might encounter. We recommend using this implementation as a standard, although it
is possible to implement the HealthCheck trait yourself if you desire more information in
your healthcheck response.
\ No newline at end of file
diff --git a/tide_disco/index.html b/tide_disco/index.html
index 79bdc81c..b2d52fed 100644
--- a/tide_disco/index.html
+++ b/tide_disco/index.html
@@ -1,4 +1,4 @@
-tide_disco - Rust
Return a JSON expression with status 200 indicating the server
is up and running. The JSON expression is normally
{“status”: “Available”}
When the server is running but unable to process requests
diff --git a/tide_disco/method/trait.ReadState.html b/tide_disco/method/trait.ReadState.html
index 49cb98a3..c46bc310 100644
--- a/tide_disco/method/trait.ReadState.html
+++ b/tide_disco/method/trait.ReadState.html
@@ -43,13 +43,13 @@
Returns an iterator for traversing the chain of errors,
starting with the current error
-and continuing with recursive calls to Error::source. Read more
For maximum effectiveness, this needs to be called as a method
diff --git a/tide_disco/route/enum.RouteError.html b/tide_disco/route/enum.RouteError.html
index a20bd9e3..58a58d88 100644
--- a/tide_disco/route/enum.RouteError.html
+++ b/tide_disco/route/enum.RouteError.html
@@ -1,4 +1,4 @@
-RouteError in tide_disco::route - Rust
RouteError encapsulates application specific errors E returned by the user-installed handler
itself. It also includes errors in the route dispatching logic, such as failures to turn the
result of the user-installed handler into an HTTP response.
Returns an iterator for traversing the chain of errors,
starting with the current error
and continuing with recursive calls to Error::source. Read more
\ No newline at end of file
diff --git a/tide_disco/route/struct.MapErr.html b/tide_disco/route/struct.MapErr.html
index debb1090..4f630c1d 100644
--- a/tide_disco/route/struct.MapErr.html
+++ b/tide_disco/route/struct.MapErr.html
@@ -1,4 +1,4 @@
-MapErr in tide_disco::route - Rust