vax-disassembler 0.1.1

DEC VAX one-line disassembler
Documentation
use std::env;
use std::fs::File;
use std::io::{BufWriter, Write};
use std::path::Path;

fn main() {
    generate_u16_map();
    generate_name_map();
}

macro_rules! process_opcodes {
    (opcodes: {$(($word: expr, $opcode: ident, $operands: tt, $desc: expr),)*},
     duplicates: {$(($dup_word: expr, $dup_opcode: ident, $dup_operands: tt, $dup_desc: expr),)*}) => {
        fn generate_u16_map() {
            let path = Path::new(&env::var("OUT_DIR").unwrap()).join("word_map.rs");
            let mut file = BufWriter::new(File::create(&path).unwrap());

            write!(
                &mut file,
                "static WORD_TO_OPCODE: phf::Map<u16, Opcode> = {}",
                phf_codegen::Map::new()
                $(
                    .entry($word, concat!("Opcode::", stringify!($opcode)))
                )+
                    .build()
            )
            .unwrap();
            write!(&mut file, ";\n").unwrap();
        }

        fn generate_name_map() {
            let path = Path::new(&env::var("OUT_DIR").unwrap()).join("name_map.rs");
            let mut file = BufWriter::new(File::create(&path).unwrap());

            write!(
                &mut file,
                "static NAME_TO_OPCODE: phf::Map<&'static str, Opcode> = {}",
                phf_codegen::Map::new()
                $(
                    .entry(stringify!($opcode), concat!("Opcode::", stringify!($opcode)))
                )+
                $(
                    .entry(stringify!($dup_opcode), concat!("Opcode::", stringify!($dup_opcode)))
                )+
                    .build()
            )
            .unwrap();
            write!(&mut file, ";\n").unwrap();
        }
    };
}

include!("src/process_opcodes.in");