use crate::ParserError;
use crate::ast::parse_data_type;
use crate::pest_parser::Rule;
use misty_ast::{Field, Schema};
use pest::iterators::Pair;
#[tracing::instrument(skip(pair))]
pub fn parse_schema(pair: Pair<Rule>) -> Result<Schema, ParserError> {
let mut inner = pair.into_inner();
let name = inner
.next()
.ok_or(ParserError::SchemaName)
.inspect_err(|error| tracing::debug!(?error, "Failed to parse the Schema type name"))?
.as_str()
.to_string();
let mut fields = Vec::new();
for field_pair in inner {
let mut field_inner = field_pair.into_inner();
let name = field_inner
.next()
.ok_or(ParserError::FieldName)
.inspect_err(|error| tracing::debug!(?error, "Failed to parse the Field type name"))?
.as_str()
.to_string();
let field_type_pair = field_inner
.next()
.ok_or(ParserError::FieldDataType)
.inspect_err(|error| tracing::debug!(?error, "Failed to parse the Field type"))?;
let field_type = parse_data_type(field_type_pair)?;
fields.push(Field { name, field_type });
}
Ok(Schema { name, fields })
}