microde-application 0.4.0

Composition and lifecycle runtime for modular Microde applications.
Documentation
use std::sync::{Arc, Mutex};

use microde_application::{MicrodeContext, MicrodeContextHandle, MicrodeError, MicrodeStopRequest};

#[derive(Default)]
struct TestContext {
    requests: Mutex<Vec<MicrodeStopRequest>>,
}

impl MicrodeContext for TestContext {
    fn request_stop(&self, request: MicrodeStopRequest) {
        self.requests.lock().unwrap().push(request);
    }

    fn panic(&self, error: Option<MicrodeError>) -> ! {
        panic!("test context panic: {error:?}");
    }
}

struct ContextOnlyModule {
    context: MicrodeContextHandle,
}

impl ContextOnlyModule {
    fn request_stop(&self) {
        self.context
            .request_stop(MicrodeStopRequest::with_exit_code(12));
    }
}

fn assert_send_sync<T: Send + Sync>() {}

#[test]
fn a_module_can_request_stop_with_a_fake_context_and_no_runtime() {
    assert_send_sync::<MicrodeContextHandle>();

    let fake = Arc::new(TestContext::default());
    let module = ContextOnlyModule {
        context: fake.clone(),
    };

    module.request_stop();

    assert_eq!(
        *fake.requests.lock().unwrap(),
        vec![MicrodeStopRequest::with_exit_code(12)]
    );
}