drone-stm32 0.8.0

Drone for STM32.
extern crate drone_mirror_failure as failure;
extern crate drone_stm32_svd;

use drone_stm32_svd::svd_generate;
use failure::Error;
use std::env;
use std::fs::File;
use std::path::Path;
use std::process;

fn main() {
  if let Err(error) = run() {
    eprintln!("{}", error);
    process::exit(1);
  }
}

fn run() -> Result<(), Error> {
  let out_dir = env::var("OUT_DIR")?;
  let out_dir = Path::new(&out_dir);
  let mut reg_map = File::create(out_dir.join("svd_reg_map.rs"))?;
  let mut reg_tokens = File::create(out_dir.join("svd_reg_tokens.rs"))?;
  let mut interrupts = File::create(out_dir.join("svd_interrupts.rs"))?;
  if let Some(svd_file) = svd_from_feature() {
    let mut input = File::open(svd_file)?;
    svd_generate(
      &mut input,
      &mut reg_map,
      &mut reg_tokens,
      &mut interrupts,
    )?;
  }
  Ok(())
}

fn svd_from_feature() -> Option<&'static str> {
  #[allow(unreachable_patterns)]
  match () {
    #[cfg(feature = "stm32f100")]
    () => Some("svd_files/STM32F100.svd"),
    #[cfg(feature = "stm32f101")]
    () => Some("svd_files/STM32F101.svd"),
    #[cfg(feature = "stm32f102")]
    () => Some("svd_files/STM32F102.svd"),
    #[cfg(feature = "stm32f103")]
    () => Some("svd_files/STM32F103.svd"),
    #[cfg(feature = "stm32f107")]
    () => Some("svd_files/STM32F107.svd"),
    #[cfg(feature = "stm32l4x1")]
    () => Some("svd_files/STM32L4x1.svd"),
    #[cfg(feature = "stm32l4x2")]
    () => Some("svd_files/STM32L4x2.svd"),
    #[cfg(feature = "stm32l4x3")]
    () => Some("svd_files/STM32L4x3.svd"),
    #[cfg(feature = "stm32l4x5")]
    () => Some("svd_files/STM32L4x5.svd"),
    #[cfg(feature = "stm32l4x6")]
    () => Some("svd_files/STM32L4x6.svd"),
    () => None,
  }
}