libsip/core/
method.rs

1use nom::{branch::alt, bytes::complete::tag_no_case, combinator::map, error::ParseError, IResult};
2use std::fmt;
3
4/// SIP protocol methods.
5#[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    /// Return all possible Methods. This comes in handy when
25    /// adding an AllowedMethods Header.
26    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
67/// Parse SIP request Method.
68pub 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}