1use nom::{branch::alt, bytes::complete::tag_no_case, combinator::map, error::ParseError, IResult};
2use std::fmt;
3
4#[derive(Debug, PartialEq, Clone, Copy)]
6pub enum Method {
7 Invite,
8 Ack,
9 Bye,
10 Cancel,
11 Register,
12 Options,
13 PRack,
14 Subscribe,
15 Notify,
16 Publish,
17 Info,
18 Refer,
19 Message,
20 Update,
21}
22
23impl Method {
24 pub fn all() -> Vec<Method> {
27 vec![
28 Method::Invite,
29 Method::Ack,
30 Method::Bye,
31 Method::Cancel,
32 Method::Register,
33 Method::Options,
34 Method::PRack,
35 Method::Subscribe,
36 Method::Notify,
37 Method::Publish,
38 Method::Info,
39 Method::Refer,
40 Method::Message,
41 Method::Update,
42 ]
43 }
44}
45
46impl fmt::Display for Method {
47 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
48 match self {
49 Method::Invite => write!(f, "INVITE"),
50 Method::Ack => write!(f, "ACK"),
51 Method::Bye => write!(f, "BYE"),
52 Method::Cancel => write!(f, "CANCEL"),
53 Method::Register => write!(f, "REGISTER"),
54 Method::Options => write!(f, "OPTIONS"),
55 Method::PRack => write!(f, "PRACK"),
56 Method::Subscribe => write!(f, "SUBSCRIBE"),
57 Method::Notify => write!(f, "NOTIFY"),
58 Method::Publish => write!(f, "PUBLISH"),
59 Method::Info => write!(f, "INFO"),
60 Method::Refer => write!(f, "REFER"),
61 Method::Message => write!(f, "MESSAGE"),
62 Method::Update => write!(f, "UPDATE"),
63 }
64 }
65}
66
67pub fn parse_method<'a, E: ParseError<&'a [u8]>>(input: &'a [u8]) -> IResult<&'a [u8], Method, E> {
69 alt::<_, _, E, _>((
70 map(tag_no_case("INVITE"), |_| Method::Invite),
71 map(tag_no_case("ACK"), |_| Method::Ack),
72 map(tag_no_case("BYE"), |_| Method::Bye),
73 map(tag_no_case("CANCEL"), |_| Method::Cancel),
74 map(tag_no_case("REGISTER"), |_| Method::Register),
75 map(tag_no_case("OPTIONS"), |_| Method::Options),
76 map(tag_no_case("PRACK"), |_| Method::PRack),
77 map(tag_no_case("SUBSCRIBE"), |_| Method::Subscribe),
78 map(tag_no_case("NOTIFY"), |_| Method::Notify),
79 map(tag_no_case("PUBLISH"), |_| Method::Publish),
80 map(tag_no_case("INFO"), |_| Method::Info),
81 map(tag_no_case("REFER"), |_| Method::Refer),
82 map(tag_no_case("MESSAGE"), |_| Method::Message),
83 map(tag_no_case("UPDATE"), |_| Method::Update),
84 ))(input)
85}