twee_v3/parser/
metadata.rs

1use nom::IResult;
2
3use crate::{utils::take_delimited_greedy, Metadata};
4
5pub(crate) fn parse_metadata(input: &str) -> IResult<&str, Metadata<&str>> {
6    let (input, content) = take_delimited_greedy('{', '}')(input)?;
7    Ok((input, Metadata::new(content)))
8}
9
10#[cfg(test)]
11mod tests {
12    use super::{parse_metadata, take_delimited_greedy, Metadata};
13
14    #[test]
15    fn test_take_greedy_simple_metadata() {
16        let input = r#"{"position":"900,600","size":"200,200"}"#;
17
18        assert_eq!(take_delimited_greedy('{', '}')(input), Ok(("", input)));
19    }
20
21    #[test]
22    fn test_take_greedy_escaped_brackets() {
23        let input = r#"{"name":"I'm \{ joe","birth":"20 of July"}"#;
24
25        assert_eq!(take_delimited_greedy('{', '}')(input), Ok(("", input)));
26    }
27
28    #[test]
29    fn test_metadata_reminder() {
30        let input = r#"{"position":"900,600","size":"200,200"} and some other stuff"#;
31
32        let expected_metadata = Metadata::new(r#"{"position":"900,600","size":"200,200"}"#);
33
34        assert_eq!(
35            parse_metadata(input),
36            Ok((" and some other stuff", expected_metadata))
37        );
38    }
39}