pub mod error;
use nom::{
bytes::complete::{tag, take_till},
multi::separated_list0,
Parser,
};
use super::Integer;
use crate::helper::macros::*;
pub use error::*;
versioned_field!(Title, String, no_versions, |s| { Ok(s.to_string()) } -> (),,);
versioned_field!(TitleUnicode, String, no_versions, |s| { Ok(s.to_string()) } -> (),,);
versioned_field!(Artist, String, no_versions, |s| { Ok(s.to_string()) } -> (),,);
versioned_field!(ArtistUnicode, String, no_versions, |s| { Ok(s.to_string()) } -> (),,);
versioned_field!(Creator, String, no_versions, |s| { Ok(s.to_string()) } -> (),,);
versioned_field!(Version, String, no_versions, |s| { Ok(s.to_string()) } -> (),,);
versioned_field!(Source, String, no_versions, |s| { Ok(s.to_string()) } -> (),,);
versioned_field!(Tags, Vec<String>, no_versions,
|s| {
let mut space_separated_list = separated_list0(
tag::<_, _, nom::error::Error<_>>(" "),
take_till(|c| c == ' '),
)
.map(|tags: Vec<&str>| tags.iter().map(|tag| tag.to_string()).collect());
Ok(space_separated_list.parse(s).unwrap().1)
} -> (),
|v| { v.join(" ") }, Vec::new()
);
versioned_field!(BeatmapID, Integer, no_versions, |s| { Ok(s.parse::<Integer>().unwrap()) } -> (),,);
versioned_field!(BeatmapSetID, Integer, no_versions, |s| { Ok(s.parse::<Integer>().unwrap()) } -> (),,);
general_section!(
pub struct Metadata {
pub title: Title,
pub title_unicode: TitleUnicode,
pub artist: Artist,
pub artist_unicode: ArtistUnicode,
pub creator: Creator,
pub version: Version,
pub source: Source,
pub tags: Tags,
pub beatmap_id: BeatmapID,
pub beatmap_set_id: BeatmapSetID,
},
ParseError,
"",
);