Move Message into a separate module
authorRichard Whitehouse <github@richardwhiuk.com>
Mon, 22 Oct 2018 13:17:30 +0000 (09:17 -0400)
committerRichard Whitehouse <github@richardwhiuk.com>
Mon, 22 Oct 2018 13:18:13 +0000 (09:18 -0400)
src/codec/mod.rs
src/lib.rs
src/message.rs [new file with mode: 0644]
src/server.rs

index 63804bb8d60b1e6fe7b48b6347410dce6aefb60b..cb6244a95c4dcb7eb1d498116aeb96e511222cf2 100644 (file)
@@ -7,9 +7,9 @@ use tokio_io::codec::{Decoder, Encoder};
 mod chartype;
 
 use self::chartype::{chartype, CharType, CR, LF};
+use message::Message;
 use parser::header;
-use parser::top_line;
-use types::{Header, Method, RequestLine, StatusLine, TopLine};
+use types::Header;
 
 impl Header {
     fn parse(line: UnparsedLine) -> Option<(Header, UnparsedLine)> {
@@ -24,7 +24,7 @@ impl Header {
 }
 
 #[derive(Clone, Debug)]
-struct UnparsedLine {
+pub struct UnparsedLine {
     value: BytesMut,
 }
 
@@ -37,7 +37,7 @@ impl UnparsedLine {
         self.value.extend_from_slice(value);
     }
 
-    fn as_bytes(&self) -> &[u8] {
+    pub fn as_bytes(&self) -> &[u8] {
         &self.value
     }
 }
@@ -197,9 +197,9 @@ impl SipCodec {
 }
 
 #[derive(Debug)]
-struct PartialMessage {
-    headers: Vec<(Header, UnparsedLine)>,
-    top_line: UnparsedLine,
+pub struct PartialMessage {
+    pub headers: Vec<(Header, UnparsedLine)>,
+    pub top_line: UnparsedLine,
 }
 
 impl PartialMessage {
@@ -223,78 +223,6 @@ impl PartialMessage {
     }
 }
 
-#[derive(Debug)]
-pub enum Message {
-    Request(Request),
-    Response(Response),
-}
-
-#[derive(Debug)]
-pub struct Response {
-    status_line: (StatusLine, UnparsedLine),
-    headers: Vec<(Header, UnparsedLine)>,
-    body: Option<BytesMut>,
-}
-
-impl Response {
-    fn as_bytes(&self) -> &[u8] {
-        return self.status_line.1.as_bytes();
-    }
-}
-
-#[derive(Debug)]
-pub struct Request {
-    request_line: (RequestLine, UnparsedLine),
-    headers: Vec<(Header, UnparsedLine)>,
-    body: Option<BytesMut>,
-}
-
-impl Request {
-    fn as_bytes(&self) -> &[u8] {
-        return self.request_line.1.as_bytes();
-    }
-
-    pub fn method(&self) -> &Method {
-        &self.request_line.0.method
-    }
-}
-
-impl Message {
-    fn new(message: PartialMessage) -> Option<Message> {
-        Message::parse(message, None)
-    }
-
-    fn parse(message: PartialMessage, body: Option<BytesMut>) -> Option<Message> {
-        match top_line(message.top_line.as_bytes()) {
-            nom::IResult::Done(_, TopLine::RequestLine(r)) => Some(Message::Request(Request {
-                headers: message.headers,
-                request_line: (r, message.top_line.clone()),
-                body: body,
-            })),
-            nom::IResult::Done(_, TopLine::StatusLine(s)) => Some(Message::Response(Response {
-                headers: message.headers,
-                status_line: (s, message.top_line.clone()),
-                body: body,
-            })),
-            result => {
-                warn!("Failed to parse top line: {:?}", result);
-                None
-            }
-        }
-    }
-
-    fn new_with_body(message: PartialMessage, body: BytesMut) -> Option<Message> {
-        Message::parse(message, Some(body))
-    }
-
-    fn as_bytes<'a>(&'a self) -> &'a [u8] {
-        match self {
-            &Message::Request(ref r) => r.as_bytes(),
-            &Message::Response(ref r) => r.as_bytes(),
-        }
-    }
-}
-
 impl Decoder for SipCodec {
     type Item = Message;
     type Error = io::Error;
index 10161b32734143d54e7f6c0d9db48b08b59d98af..1446ef7de80502c281a7b652792c653ff8bf1ce4 100644 (file)
@@ -12,6 +12,7 @@ extern crate log;
 extern crate nom;
 
 mod codec;
+mod message;
 mod parser;
 pub mod server;
 mod types;
diff --git a/src/message.rs b/src/message.rs
new file mode 100644 (file)
index 0000000..e3e01e2
--- /dev/null
@@ -0,0 +1,78 @@
+use bytes::BytesMut;
+use nom;
+
+use codec::{PartialMessage, UnparsedLine};
+use parser::top_line;
+use types::{Header, Method, RequestLine, StatusLine, TopLine};
+
+#[derive(Debug)]
+pub enum Message {
+    Request(Request),
+    Response(Response),
+}
+
+impl Message {
+    pub fn new(message: PartialMessage) -> Option<Message> {
+        Message::parse(message, None)
+    }
+
+    pub fn new_with_body(message: PartialMessage, body: BytesMut) -> Option<Message> {
+        Message::parse(message, Some(body))
+    }
+
+    pub fn parse(message: PartialMessage, body: Option<BytesMut>) -> Option<Message> {
+        match top_line(message.top_line.as_bytes()) {
+            nom::IResult::Done(_, TopLine::RequestLine(r)) => Some(Message::Request(Request {
+                headers: message.headers,
+                request_line: (r, message.top_line.clone()),
+                body: body,
+            })),
+            nom::IResult::Done(_, TopLine::StatusLine(s)) => Some(Message::Response(Response {
+                headers: message.headers,
+                status_line: (s, message.top_line.clone()),
+                body: body,
+            })),
+            result => {
+                warn!("Failed to parse top line: {:?}", result);
+                None
+            }
+        }
+    }
+
+    pub fn as_bytes<'a>(&'a self) -> &'a [u8] {
+        match self {
+            &Message::Request(ref r) => r.as_bytes(),
+            &Message::Response(ref r) => r.as_bytes(),
+        }
+    }
+}
+
+#[derive(Debug)]
+pub struct Response {
+    status_line: (StatusLine, UnparsedLine),
+    headers: Vec<(Header, UnparsedLine)>,
+    body: Option<BytesMut>,
+}
+
+impl Response {
+    pub fn as_bytes(&self) -> &[u8] {
+        return self.status_line.1.as_bytes();
+    }
+}
+
+#[derive(Debug)]
+pub struct Request {
+    request_line: (RequestLine, UnparsedLine),
+    headers: Vec<(Header, UnparsedLine)>,
+    body: Option<BytesMut>,
+}
+
+impl Request {
+    pub fn as_bytes(&self) -> &[u8] {
+        return self.request_line.1.as_bytes();
+    }
+
+    pub fn method(&self) -> &Method {
+        &self.request_line.0.method
+    }
+}
index a40b3cee6ea443dc43be90ce0d74842aa21c757d..030952b8d57c71c4ddb3a2025efa9dcfb81e71c5 100644 (file)
@@ -1,4 +1,3 @@
-use codec::{Message, SipCodec};
 use futures::future;
 use futures::{Future, Stream};
 use std;
@@ -7,6 +6,9 @@ use tokio_core::net::TcpListener;
 use tokio_core::reactor::Handle;
 use tokio_io::codec::Decoder;
 
+use codec::SipCodec;
+use message::Message;
+
 pub struct Sip {
     listeners: Vec<TcpListener>,
 }
@@ -69,10 +71,10 @@ mod tests {
     extern crate env_logger;
 
     use super::Sip;
-    use codec::Message;
     use futures;
     use futures::future::Either;
     use futures::Future;
+    use message::Message;
     use std::net::Shutdown;
     use std::ops::DerefMut;
     use std::sync::Arc;