use std::path::Path;
use quote::ToTokens;
use proc_macro2::TokenStream;
use crate::{file_to_sleigh, SleighError};
mod builder;
use builder::Disassembler;
pub(crate) const DISASSEMBLY_ALLOW_OVERFLOW: bool = true;
fn disassembler(file: impl AsRef<Path>, debug: bool) -> Result<TokenStream, Box<SleighError>> {
let sleigh = file_to_sleigh(file.as_ref())?;
Ok(Disassembler::new(sleigh, debug).into_token_stream())
}
pub fn generate_disassembler(file: impl AsRef<Path>) -> Result<TokenStream, Box<SleighError>> {
disassembler(file, false)
}
pub fn generate_debug_disassembler(
file: impl AsRef<Path>,
) -> Result<TokenStream, Box<SleighError>> {
disassembler(file, true)
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum GeneratedModuleKind {
Shared,
TableBatch,
TableEnum,
SplitTableEnum,
Root,
}
pub struct GeneratedModule {
pub kind: GeneratedModuleKind,
pub is_instruction_table: bool,
pub filename: String,
pub code: TokenStream,
pub raw_code: Option<String>,
}
pub fn generate_split_disassembler(
file: impl AsRef<Path>,
tables_per_file: usize,
out_dir: &str,
) -> Result<Vec<GeneratedModule>, Box<SleighError>> {
let sleigh = file_to_sleigh(file.as_ref())?;
let dis = Disassembler::new(sleigh, false);
Ok(dis.to_split_modules(tables_per_file, out_dir))
}