use thiserror::Error;
use crate::{Btor2, Nid, Node, Sid, Sort};
impl Btor2 {
pub(crate) fn parse_line(&mut self, line: &str) -> Result<(), LineError> {
if line.starts_with(';') {
return Ok(());
}
let mut split = line.split_whitespace();
let Some(id) = split.next() else {
return Ok(());
};
let second = split.next().ok_or(LineError::MissingSecondSymbol)?;
if second == "sort" {
let sort = Sort::parse(split)?;
let sid = Sid::try_from_str(id)?;
if self.sorts.insert(sid, sort).is_some() {
return Err(LineError::DuplicateSid(sid));
}
return Ok(());
}
if let Some(node) = Node::try_parse(second, split)? {
let nid = Nid::try_from_str(id)?;
if self.nodes.insert(nid, node).is_some() {
return Err(LineError::DuplicateNid(nid));
}
return Ok(());
}
Err(LineError::InvalidLine)
}
}
#[derive(Error, Debug, Clone)]
pub(crate) enum LineError {
#[error("Missing second symbol")]
MissingSecondSymbol,
#[error("Missing constant")]
MissingConstant,
#[error("Missing number")]
MissingNumber,
#[error("Missing sort id")]
MissingSid,
#[error("Missing node id")]
MissingNid,
#[error("Missing right-side node id")]
MissingRnid,
#[error("Missing sort type")]
MissingSortType,
#[error("Missing bitvec length")]
MissingBitvecLength,
#[error("Invalid line")]
InvalidLine,
#[error("Invalid number {0:?}")]
InvalidNumber(String),
#[error("Invalid sort id {0:?}")]
InvalidSid(String),
#[error("Invalid node id {0:?}")]
InvalidNid(String),
#[error("Invalid right-side node id {0:?}")]
InvalidRnid(String),
#[error("Invalid slice with upper bit lower than lower bit")]
InvalidSlice,
#[error("Invalid sort type")]
InvalidSortType,
#[error("Invalid bitvec length")]
InvalidBitvecLength,
#[error("Duplicate sort id {0}")]
DuplicateSid(Sid),
#[error("Duplicate node id {0}")]
DuplicateNid(Nid),
}