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
#[macro_use] extern crate log; #[macro_use] extern crate genco; #[macro_use] extern crate reproto_backend as backend; extern crate reproto_core as core; mod listeners; mod rust_backend; mod rust_compiler; mod rust_file_spec; mod rust_options; mod module; use self::backend::{App, ArgMatches, CompilerOptions, Environment, Options}; use self::backend::errors::*; use self::listeners::Listeners; use self::rust_backend::RustBackend; use self::rust_options::RustOptions; const MOD: &str = "mod"; const EXT: &str = "rs"; const RUST_CONTEXT: &str = "rust"; fn setup_module(module: &str) -> Result<Box<Listeners>> { let module: Box<Listeners> = match module { "chrono" => Box::new(module::Chrono::new()), _ => return Err(format!("No such module: {}", module).into()), }; Ok(module) } pub fn setup_listeners(modules: Vec<String>) -> Result<(RustOptions, Box<Listeners>)> { let mut listeners: Vec<Box<Listeners>> = Vec::new(); for module in modules { debug!("+module: {}", module); listeners.push(setup_module(module.as_str())?); } let mut options = RustOptions::new(); for listener in &listeners { listener.configure(&mut options)?; } Ok((options, Box::new(listeners))) } pub fn compile_options<'a, 'b>(out: App<'a, 'b>) -> App<'a, 'b> { out.about("Compile for Rust") } pub fn verify_options<'a, 'b>(out: App<'a, 'b>) -> App<'a, 'b> { out.about("Verify for Rust") } pub fn compile( env: Environment, opts: Options, compiler_options: CompilerOptions, _matches: &ArgMatches, ) -> Result<()> { let id_converter = opts.id_converter; let (options, listeners) = setup_listeners(opts.modules)?; let backend = RustBackend::new(env, options, listeners, id_converter); let compiler = backend.compiler(compiler_options)?; compiler.compile() } pub fn verify(env: Environment, opts: Options, _matches: &ArgMatches) -> Result<()> { let id_converter = opts.id_converter; let (options, listeners) = setup_listeners(opts.modules)?; let backend = RustBackend::new(env, options, listeners, id_converter); backend.verify() }