1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
#[macro_use] extern crate genco; #[macro_use] extern crate log; #[macro_use] extern crate reproto_backend as backend; extern crate reproto_core as core; extern crate reproto_manifest as manifest; extern crate serde; #[allow(unused)] #[macro_use] extern crate serde_derive; extern crate toml; mod listeners; mod rust_backend; mod rust_compiler; mod rust_file_spec; mod rust_options; mod module; mod utils; use self::ErrorKind::*; use backend::{ArgMatches, Environment}; use backend::errors::*; use core::Context; use listeners::Listeners; use manifest::{self as m, Lang, Manifest, NoModule, TryFromToml}; use rust_backend::RustBackend; use rust_options::RustOptions; use std::path::Path; use std::rc::Rc; const MOD: &str = "mod"; const EXT: &str = "rs"; const RUST_CONTEXT: &str = "rust"; #[derive(Default)] pub struct RustLang; impl Lang for RustLang { type Module = RustModule; } #[derive(Debug)] pub enum RustModule { Chrono, Grpc, } impl TryFromToml for RustModule { fn try_from_string(path: &Path, id: &str, value: String) -> m::errors::Result<Self> { use self::RustModule::*; let result = match id { "chrono" => Chrono, "grpc" => Grpc, _ => return NoModule::illegal(path, id, value), }; Ok(result) } fn try_from_value(path: &Path, id: &str, value: toml::Value) -> m::errors::Result<Self> { use self::RustModule::*; let result = match id { "chrono" => Chrono, "grpc" => Grpc, _ => return NoModule::illegal(path, id, value), }; Ok(result) } } pub fn setup_listeners(modules: &[RustModule]) -> Result<(RustOptions, Box<Listeners>)> { use self::RustModule::*; let mut listeners: Vec<Box<Listeners>> = Vec::new(); for module in modules { debug!("+module: {:?}", module); let listener = match *module { Chrono => Box::new(module::Chrono::new()) as Box<Listeners>, Grpc => Box::new(module::Grpc::new()) as Box<Listeners>, }; listeners.push(listener); } let mut options = RustOptions::new(); for listener in &listeners { listener.configure(&mut options)?; } Ok((options, Box::new(listeners))) } pub fn compile( _ctx: Rc<Context>, env: Environment, _matches: &ArgMatches, manifest: Manifest<RustLang>, ) -> Result<()> { let out = manifest.output.ok_or(MissingOutput)?; let (options, listeners) = setup_listeners(&manifest.modules)?; let backend = RustBackend::new(env, options, listeners); let compiler = backend.compiler(out)?; compiler.compile() }