|
| 1 | + 1| |// compile-flags: --edition=2018 |
| 2 | + 2| |#![feature(no_coverage)] |
| 3 | + 3| | |
| 4 | + 4| |macro_rules! bail { |
| 5 | + 5| | ($msg:literal $(,)?) => { |
| 6 | + 6| | if $msg.len() > 0 { |
| 7 | + 7| | println!("no msg"); |
| 8 | + 8| | } else { |
| 9 | + 9| | println!($msg); |
| 10 | + 10| | } |
| 11 | + 11| | return Err(String::from($msg)); |
| 12 | + 12| | }; |
| 13 | + 13| |} |
| 14 | + 14| | |
| 15 | + 15| |macro_rules! on_error { |
| 16 | + 16| | ($value:expr, $error_message:expr) => { |
| 17 | + 17| 0| $value.or_else(|e| { |
| 18 | + 18| 0| let message = format!($error_message, e); |
| 19 | + 19| 0| if message.len() > 0 { |
| 20 | + 20| 0| println!("{}", message); |
| 21 | + 21| 0| Ok(String::from("ok")) |
| 22 | + 22| | } else { |
| 23 | + 23| 0| bail!("error"); |
| 24 | + 24| | } |
| 25 | + 25| 0| }) |
| 26 | + 26| | }; |
| 27 | + 27| |} |
| 28 | + 28| | |
| 29 | + 29| 1|fn load_configuration_files() -> Result<String, String> { |
| 30 | + 30| 1| Ok(String::from("config")) |
| 31 | + 31| 1|} |
| 32 | + 32| | |
| 33 | + 33| 1|pub async fn test() -> Result<(), String> { |
| 34 | + 34| 1| println!("Starting service"); |
| 35 | + 35| 1| let config = on_error!(load_configuration_files(), "Error loading configs: {}")?; |
| 36 | + ^0 |
| 37 | + 36| | |
| 38 | + 37| 1| let startup_delay_duration = String::from("arg"); |
| 39 | + 38| 1| let _ = (config, startup_delay_duration); |
| 40 | + 39| 1| Ok(()) |
| 41 | + 40| 1|} |
| 42 | + 41| | |
| 43 | + 42| |#[no_coverage] |
| 44 | + 43| |fn main() { |
| 45 | + 44| | executor::block_on(test()); |
| 46 | + 45| |} |
| 47 | + 46| | |
| 48 | + 47| |mod executor { |
| 49 | + 48| | use core::{ |
| 50 | + 49| | future::Future, |
| 51 | + 50| | pin::Pin, |
| 52 | + 51| | task::{Context, Poll, RawWaker, RawWakerVTable, Waker}, |
| 53 | + 52| | }; |
| 54 | + 53| | |
| 55 | + 54| | #[no_coverage] |
| 56 | + 55| | pub fn block_on<F: Future>(mut future: F) -> F::Output { |
| 57 | + 56| | let mut future = unsafe { Pin::new_unchecked(&mut future) }; |
| 58 | + 57| | use std::hint::unreachable_unchecked; |
| 59 | + 58| | static VTABLE: RawWakerVTable = RawWakerVTable::new( |
| 60 | + 59| | |
| 61 | + 60| | #[no_coverage] |
| 62 | + 61| | |_| unsafe { unreachable_unchecked() }, // clone |
| 63 | + 62| | |
| 64 | + 63| | #[no_coverage] |
| 65 | + 64| | |_| unsafe { unreachable_unchecked() }, // wake |
| 66 | + 65| | |
| 67 | + 66| | #[no_coverage] |
| 68 | + 67| | |_| unsafe { unreachable_unchecked() }, // wake_by_ref |
| 69 | + 68| | |
| 70 | + 69| | #[no_coverage] |
| 71 | + 70| | |_| (), |
| 72 | + 71| | ); |
| 73 | + 72| | let waker = unsafe { Waker::from_raw(RawWaker::new(core::ptr::null(), &VTABLE)) }; |
| 74 | + 73| | let mut context = Context::from_waker(&waker); |
| 75 | + 74| | |
| 76 | + 75| | loop { |
| 77 | + 76| | if let Poll::Ready(val) = future.as_mut().poll(&mut context) { |
| 78 | + 77| | break val; |
| 79 | + 78| | } |
| 80 | + 79| | } |
| 81 | + 80| | } |
| 82 | + 81| |} |
| 83 | + |
0 commit comments