1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
use std::cmp::{Ordering, PartialEq, PartialOrd};

#[derive(Clone, Copy, PartialEq, Eq)]
pub enum OAuthParameter {
    Callback,
    ConsumerKey,
    Nonce,
    SignatureMethod,
    Timestamp,
    Token,
    Verifier,
    Version,
    None,
}

impl OAuthParameter {
    pub fn next(self) -> OAuthParameter {
        match self {
            OAuthParameter::Callback => OAuthParameter::ConsumerKey,
            OAuthParameter::ConsumerKey => OAuthParameter::Nonce,
            OAuthParameter::Nonce => OAuthParameter::SignatureMethod,
            OAuthParameter::SignatureMethod => OAuthParameter::Timestamp,
            OAuthParameter::Timestamp => OAuthParameter::Token,
            OAuthParameter::Token => OAuthParameter::Verifier,
            OAuthParameter::Verifier => OAuthParameter::Version,
            OAuthParameter::Version => OAuthParameter::None,
            OAuthParameter::None => {
                debug_assert!(false, "called `next` on an `OAuthParameter::None`");
                OAuthParameter::Callback
            }
        }
    }

    fn as_str(self) -> Option<&'static str> {
        match self {
            OAuthParameter::Callback => Some("oauth_callback"),
            OAuthParameter::ConsumerKey => Some("oauth_consumer_key"),
            OAuthParameter::Nonce => Some("oauth_nonce"),
            OAuthParameter::SignatureMethod => Some("oauth_signature_method"),
            OAuthParameter::Timestamp => Some("oauth_timestamp"),
            OAuthParameter::Token => Some("oauth_token"),
            OAuthParameter::Verifier => Some("oauth_verifier"),
            OAuthParameter::Version => Some("oauth_version"),
            OAuthParameter::None => None,
        }
    }
}

impl Default for OAuthParameter {
    fn default() -> Self {
        OAuthParameter::Callback
    }
}

impl PartialEq<str> for OAuthParameter {
    fn eq(&self, s: &str) -> bool {
        match self.as_str() {
            Some(t) => t == s,
            None => false,
        }
    }
}

impl PartialOrd<str> for OAuthParameter {
    fn partial_cmp(&self, s: &str) -> Option<Ordering> {
        match self.as_str() {
            Some(t) => t.partial_cmp(s),
            None => Some(Ordering::Greater),
        }
    }
}