1use anyhow::{Context, Result};
4use cjam::ModuleType;
5use tracing_subscriber::EnvFilter;
6
7pub fn init_logger() {
9 unsafe {
10 spacevm::init_logger(true, true);
11 }
12
13 let _ = tracing_subscriber::fmt()
14 .with_env_filter(EnvFilter::from_default_env())
15 .try_init();
16}
17
18pub fn load_service(package: &str) -> Result<Vec<u8>> {
20 let target = etc::find_up("target")
21 .expect("Failed to find target directory")
22 .join("jam")
23 .join(format!("{package}.jam"));
24
25 std::fs::read(&target).context(format!("Failed to read {}", target.display()))
26}
27
28pub fn build_service(package: &str, module: Option<ModuleType>) {
30 cjam::util::build(package, module).expect("Failed to build service");
31}
32
33#[macro_export]
35macro_rules! service {
36 () => {{
37 $crate::util::init_logger();
38 match $crate::util::load_service(env!("CARGO_PKG_NAME")) {
39 Ok(blob) => blob,
40 Err(e) => {
41 $crate::util::build_service(
42 env!("CARGO_PKG_NAME"),
43 Some(env!("CARGO_MANIFEST_DIR").to_string()),
44 );
45 $crate::util::load_service(env!("CARGO_PKG_NAME")).expect("Failed to load service")
46 }
47 }
48 }};
49}