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
#![cfg(feature = "unstable")]

use nom::bytes::complete::{tag, take_till};
use nom::character::complete::{char, space1};
use nom::sequence::delimited;

use crate::{date::date, Date, IResult, Span};

#[derive(Debug, Clone)]
pub struct Event<'a> {
    date: Date,
    name: &'a str,
    value: &'a str,
}

impl<'a> Event<'a> {
    #[must_use]
    pub fn date(&self) -> Date {
        self.date
    }

    #[must_use]
    pub fn name(&self) -> &'a str {
        self.name
    }

    #[must_use]
    pub fn value(&self) -> &'a str {
        self.value
    }
}

pub(crate) fn event(input: Span<'_>) -> IResult<'_, Event<'_>> {
    let (input, date) = date(input)?;
    let (input, _) = delimited(space1, tag("event"), space1)(input)?;
    let (input, name) = delimited(char('"'), take_till(|c| c == '"'), char('"'))(input)?;
    let (input, _) = space1(input)?;
    let (input, value) = delimited(char('"'), take_till(|c| c == '"'), char('"'))(input)?;
    Ok((
        input,
        Event {
            date,
            name: name.fragment(),
            value: value.fragment(),
        },
    ))
}