#![feature(yggdrasil_os, if_let_guard)]

fn main() {}
// use std::{fmt::{LowerHex, Display}, io, path::PathBuf, process::Command};
//
// use clap::Parser;
// use debugger::{Debugger, SymbolResolver};
// use imp::TargetImpl;
// use yggdrasil_abi::arch::SavedFrame;
//
// #[cfg(any(target_arch = "x86_64", target_arch = "x86", rust_analyzer))]
// #[path = "x86.rs"]
// pub mod imp;
// #[cfg(any(target_arch = "aarch64", rust_analyzer))]
// #[path = "aarch64.rs"]
// pub mod imp;
//
// pub mod comm;
// pub mod state;
//
// pub mod debugger;
//
// #[derive(thiserror::Error, Debug)]
// pub enum Error {
//     #[error("I/O error: {0}")]
//     IoError(#[from] io::Error),
//     #[error("Terminal error: {0}")]
//     TermError(#[from] libterm::Error),
//     #[error("Debug control error: {0:?}")]
//     DebugError(yggdrasil_rt::Error),
//     #[error("Invalid address: {0:?}")]
//     InvalidAddress(String)
// }
//
// pub trait Target {
//     type Instruction;
//     type InstructionFormatter: InstructionFormatter<Self::Instruction>;
//     type Register: LowerHex;
//
//     fn disassemble(
//         window: &[u8],
//         ip: usize,
//         limit: usize,
//     ) -> Result<Vec<(usize, Self::Instruction)>, Error>;
//     fn new_instruction_formatter(resolver: SymbolResolver) -> Self::InstructionFormatter;
//
//     fn register_list(frame: &SavedFrame, out: &mut Vec<(String, Self::Register)>);
//     fn flags_register_as_display(frame: &SavedFrame) -> impl Display;
//     fn real_ip(frame: &SavedFrame) -> usize;
// }
//
// pub trait InstructionFormatter<I> {
//     fn format_instruction(&mut self, insn: &I, out: &mut String);
// }
//
// #[derive(Parser)]
// struct Args {
//     program: PathBuf,
// }
//
// fn main() {
//     let args = Args::parse();
//
//     let command = Command::new(&args.program);
//     let debug: Debugger<TargetImpl> = Debugger::from_command(&args.program, command).unwrap();
//
//     debug.run().unwrap();
// }
