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
mod log_header;
mod log_message;

pub use log_header::LogHeader;
pub use log_message::LogMessage;

use crate::ParseError;

#[derive(Debug)]
pub struct LogLine {
    pub header: LogHeader,
    pub message: LogMessage,
}

impl LogLine {
    // TODO: Refactor with less nesting.
    pub fn parse(log_line_string: &str) -> Result<LogLine, ParseError> {
        let log_header_result = LogHeader::parse(log_line_string);

        match log_header_result {
            Ok((log_header, raw_log_message)) => {
                let log_message_result = LogMessage::parse(raw_log_message);
                match log_message_result {
                    Ok(log_message) => Ok(LogLine {
                        header: log_header,
                        message: log_message,
                    }),
                    Err(_) => Err(ParseError),
                }
            }
            Err(_) => Err(ParseError),
        }
    }
}