ffmetadata 0.1.2

A simple parser for ffmpeg's ffmetadata format
Documentation
const TEST_DOC: &str = r##";FFMETADATA1
title=bike\\shed
;this is a comment
artist=FFmpeg troll team

[CHAPTER]
TIMEBASE=1/1000
START=0
#chapter ends at 0:01:00
END=60000
title=chapter \#1
[STREAM]
title=multi\
line
"##;

const RECREATED_DOC: &str = r##";FFMETADATA1
title=bike\\shed
artist=FFmpeg troll team

[CHAPTER]
TIMEBASE=1/1000
START=0
END=60000
title=chapter \#1

[STREAM]
title=multi\
line

"##;

use crate::FFMetadata;

#[test]
fn parse_section_header() {
  crate::section_header("[TEST]\n").unwrap();
}

#[test]
fn parse_kv() {
  crate::kv("test=ok\n").unwrap();
}

#[test]
fn parse_kv_escaped() {
  let (input, (k, v)) = crate::kv("test= ok\\\n\n").unwrap();
  assert_eq!(input, "");
  assert_eq!(k, String::from("test"));
  assert_eq!(v, String::from(" ok\n"));
}

#[test]
fn parse_simple() {
  let meta = FFMetadata::parse(";FFMETADATA1\ntest=doc\n").unwrap();
  assert_eq!(meta.global[0], (String::from("test"), String::from("doc")));
}

#[test]
fn parse_it() {
  let meta = FFMetadata::parse(TEST_DOC).unwrap();
  assert_eq!(format!("{}", meta), RECREATED_DOC);
}

#[test]
fn bad_magic() {
  assert!(FFMetadata::parse("\n;FFMETADATA1").is_err());
  assert!(FFMetadata::parse(";FFMETADATA\n").is_err());
}