1use std::fmt;
2use std::str::FromStr;
3
4use self::Method::*;
5
6use crate::hyper;
7
8#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
33pub enum Method {
34 Get,
36 Put,
38 Post,
40 Delete,
42 Options,
44 Head,
46 Trace,
48 Connect,
50 Patch
52}
53
54impl Method {
55 #[doc(hidden)]
57 pub fn from_hyp(method: &hyper::Method) -> Option<Method> {
58 match *method {
59 hyper::Method::GET => Some(Get),
60 hyper::Method::PUT => Some(Put),
61 hyper::Method::POST => Some(Post),
62 hyper::Method::DELETE => Some(Delete),
63 hyper::Method::OPTIONS => Some(Options),
64 hyper::Method::HEAD => Some(Head),
65 hyper::Method::TRACE => Some(Trace),
66 hyper::Method::CONNECT => Some(Connect),
67 hyper::Method::PATCH => Some(Patch),
68 _ => None,
69 }
70 }
71
72 #[inline]
93 pub fn supports_payload(self) -> bool {
94 match self {
95 Put | Post | Delete | Patch => true,
96 Get | Head | Connect | Trace | Options => false,
97 }
98 }
99
100 #[inline]
111 pub fn as_str(self) -> &'static str {
112 match self {
113 Get => "GET",
114 Put => "PUT",
115 Post => "POST",
116 Delete => "DELETE",
117 Options => "OPTIONS",
118 Head => "HEAD",
119 Trace => "TRACE",
120 Connect => "CONNECT",
121 Patch => "PATCH",
122 }
123 }
124}
125
126impl FromStr for Method {
127 type Err = ();
128
129 fn from_str(s: &str) -> Result<Method, ()> {
132 match s {
133 x if uncased::eq(x, Get.as_str()) => Ok(Get),
134 x if uncased::eq(x, Put.as_str()) => Ok(Put),
135 x if uncased::eq(x, Post.as_str()) => Ok(Post),
136 x if uncased::eq(x, Delete.as_str()) => Ok(Delete),
137 x if uncased::eq(x, Options.as_str()) => Ok(Options),
138 x if uncased::eq(x, Head.as_str()) => Ok(Head),
139 x if uncased::eq(x, Trace.as_str()) => Ok(Trace),
140 x if uncased::eq(x, Connect.as_str()) => Ok(Connect),
141 x if uncased::eq(x, Patch.as_str()) => Ok(Patch),
142 _ => Err(()),
143 }
144 }
145}
146
147impl fmt::Display for Method {
148 #[inline(always)]
149 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
150 self.as_str().fmt(f)
151 }
152}
153
154#[cfg(feature = "serde")]
155mod serde {
156 use std::fmt;
157 use super::*;
158
159 use serde_::ser::{Serialize, Serializer};
160 use serde_::de::{Deserialize, Deserializer, Error, Visitor, Unexpected};
161
162 impl<'a> Serialize for Method {
163 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
164 serializer.serialize_str(self.as_str())
165 }
166 }
167
168 struct DeVisitor;
169
170 impl<'de> Visitor<'de> for DeVisitor {
171 type Value = Method;
172
173 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
174 write!(formatter, "valid HTTP method string")
175 }
176
177 fn visit_str<E: Error>(self, v: &str) -> Result<Self::Value, E> {
178 Method::from_str(v).map_err(|_| E::invalid_value(Unexpected::Str(v), &self))
179 }
180 }
181
182 impl<'de> Deserialize<'de> for Method {
183 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
184 deserializer.deserialize_str(DeVisitor)
185 }
186 }
187}