use colored::Colorize;
use nom::{branch::alt, bytes::complete::{tag, take_until}, character::complete::{char, space0}, combinator::opt, multi::separated_list1, sequence::{delimited, preceded, terminated}, IResult, Parser};
use crate::{model::{Data, SId}, parser::{context::ParseContext, doc::StofParseError, expr::blob_number, whitespace::whitespace}};
pub fn parse_data<'a>(input: &'a str, context: &mut ParseContext) -> IResult<&'a str, (), StofParseError> {
let (input, _) = whitespace(input)?;
let (input, version) = opt(preceded(tag("data"), opt(preceded(char('@'), take_until(" "))))).parse(input)?;
let (input, _) = space0(input)?;
if let Some(version) = version {
if let Some(_version) = version {
}
}
let (input, bytes) = delimited(
char('|'),
terminated(separated_list1(char(','), blob_number), whitespace),
alt((
preceded(char(','), preceded(whitespace, char('|'))),
char('|')
))
).parse(input)?;
let (input, _) = opt(preceded(space0, alt((char(';'), char(','))))).parse(input)?;
let self_ptr = context.self_ptr();
if let Ok(mut data) = bincode::deserialize::<Data>(&bytes) {
if data.id.data_exists(&context.graph) {
data.id = SId::default();
}
data.nodes.clear();
if let Some(_dref) = context.graph.insert_data(&self_ptr, data) {
return Ok((input, ()));
}
}
let path = self_ptr.node_path(&context.graph, true).unwrap().join(".");
println!("{} {} {}", "failed to deserialize stof data @".dimmed(), path.purple(), "missing data".red());
return Ok((input, ()));
}