// Copyright (C) 2021 "Maxime “pep” Buquet " // // This program is free software: you can redistribute it and/or modify it // under the terms of the GNU Affero General Public License as published by the // Free Software Foundation, either version 3 of the License, or (at your // option) any later version. // // This program is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License // for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . use std::env; use std::fmt; use std::fs::{self, File}; use std::io::{BufWriter, Write}; use std::error::Error as StdError; use std::path::Path; use quote::{format_ident, quote}; #[derive(Debug, Eq, PartialEq)] pub enum Error { EnvVariableError(env::VarError), ROMDoesntExist, UnableToOpenROM, } impl StdError for Error {} impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { match self { Error::EnvVariableError(e) => write!(f, "POKEMON_ROM env var error: {}", e), Error::ROMDoesntExist => write!(f, "ROM doesn't exist"), Error::UnableToOpenROM => write!(f, "Unable to open ROM"), } } } impl From for Error { fn from(err: env::VarError) -> Error { Error::EnvVariableError(err) } } fn get_rom() -> Result, Error> { let env_romp = env::var("POKEMON_ROM")?; let romp = Path::new(&env_romp); if ! romp.exists() { return Err(Error::ROMDoesntExist); } Ok(match fs::read(romp) { Ok(v) => v, Err(_) => return Err(Error::UnableToOpenROM), }) } fn main() -> Result<(), Error> { let output = Path::new(&env::var("OUT_DIR").unwrap()).join("output.rs"); let mut output = BufWriter::new(File::create(&output).unwrap()); let _rom: Vec = get_rom()?; let pkmn_names: Vec<_> = [ "Rhydon", "Kangashkan", "NidoranM", ].iter() .map(|n| format_ident!("{}", n)) .collect(); let tokens = quote! { /// Generated file containing various resources extracted from the provided ROM. pub enum PokemonNames { #(#pkmn_names),* } }; write!(output, "{}", tokens).unwrap(); Ok(()) }