use std::error::Error;
use crate::{CantaraImportParsingError, ParsingErrorType};
use crate::{song::Song, CantaraImportNoContentError};
use crate::importer::metadata::parse_metadata_block;
pub fn import_input_string(import_string: String, file_name: String) -> Result<Song, Box<dyn Error>> {
let import_string = import_string.trim();
if import_string.is_empty() {
return Err(Box::new(CantaraImportNoContentError));
};
let mut flag_first_block = true;
let mut flag_first_line = true;
let mut flag_is_metadata_block = false;
let mut cur_block: String = "".to_string();
let mut song: Song = Song::new("");
for (num, line) in import_string.split("\n").enumerate() {
if line.is_empty() {
if !cur_block.is_empty() {
if flag_is_metadata_block {
for (key, value) in parse_metadata_block(&cur_block) {
song.add_tag(&key, &value);
}
}
} else {
}
cur_block = "".to_string();
flag_first_line = true;
flag_first_block = false;
continue;
}
if flag_first_block && flag_first_line {
if line.contains(":") {
flag_is_metadata_block = true;
}
}
if flag_first_line && !flag_is_metadata_block {
if !line.starts_with("#") {
return Err(
Box::new(
CantaraImportParsingError {
line: num,
error_type: ParsingErrorType::BlockNeedsToStartWithCategorization
}
)
);
}
}
if flag_first_line {
flag_first_line = false;
}
if line.trim().is_empty() {
flag_first_line = true;
}
cur_block = cur_block + line + "\n";
}
Ok(song)
}