use crate::ir::Program;
#[derive(Debug, thiserror::Error)]
pub enum ReadError {
#[error("parse error: {0}")]
Parse(String),
#[error("unsupported syntax: {0}")]
Unsupported(String),
#[error("expected {expected}, got {got}")]
UnexpectedNode { expected: String, got: String },
}
pub trait Reader: Send + Sync {
fn language(&self) -> &'static str;
fn extensions(&self) -> &'static [&'static str];
fn read(&self, source: &str) -> Result<Program, ReadError>;
}
pub trait Writer: Send + Sync {
fn language(&self) -> &'static str;
fn extension(&self) -> &'static str;
fn write(&self, program: &Program) -> String;
}