1use gaia_types::{helpers::Architecture, GaiaError, Result};
2
3pub mod builder;
4pub mod decoder;
5pub mod encoder;
6pub mod instruction;
7
8use instruction::Instruction;
9
10pub struct X86_64Assembler {
11 architecture: Architecture,
12}
13
14impl X86_64Assembler {
15 pub fn new(architecture: Architecture) -> Result<Self> {
16 match architecture {
17 Architecture::X86 | Architecture::X86_64 => Ok(Self { architecture }),
18 _ => Err(GaiaError::unsupported_architecture(architecture)),
19 }
20 }
21
22 pub fn encode(&self, instruction: &Instruction) -> Result<Vec<u8>> {
23 let encoder = encoder::InstructionEncoder::new(self.architecture.clone());
24 encoder.encode(instruction)
25 }
26
27 pub fn decode(&self, bytes: &[u8]) -> Result<Vec<Instruction>> {
28 let decoder = decoder::InstructionDecoder::new(self.architecture.clone());
29 decoder.decode(bytes)
30 }
31
32 pub fn architecture(&self) -> Architecture {
33 self.architecture.clone()
34 }
35
36 pub fn set_architecture(&mut self, architecture: Architecture) -> Result<()> {
37 match architecture {
38 Architecture::X86 | Architecture::X86_64 => {
39 self.architecture = architecture;
40 Ok(())
41 }
42 _ => Err(GaiaError::unsupported_architecture(architecture)),
43 }
44 }
45}