pub mod core;
pub mod providers;
pub mod telemetry;
pub use operonx_macros::{model, op, resource};
pub use ::inventory;
pub use core::engine::{
CollectMode, ExecutionHandle, FrameEvent, FrameSender, GraphEnvelope, Operon, OperonBuilder,
Scheduler,
};
pub use core::exceptions::{OperonError, SUPPORTED_SCHEMA_VERSION};
pub use core::middleware::{Middleware, MiddlewareContext};
pub use core::ops::{Interrupt, INTERRUPT_KEY};
pub use core::registry::{
bootstrap_env_paths, record_env_path, OpEntry, OpKind, ResourceEntry, ResourceHub,
};
use std::path::{Path, PathBuf};
pub fn bootstrap(opts: BootstrapOpts) -> Option<std::sync::Arc<ResourceHub>> {
if opts.env {
load_env_into_bootstrap();
}
let _ = crate::providers::registry::register_all();
if let Ok(g) = ResourceHub::instance() {
return Some(g);
}
if let Some(path) = opts.resources.as_ref() {
match ResourceHub::from_yaml(path) {
Ok(hub) => {
let arc = std::sync::Arc::new(hub);
ResourceHub::set_instance(arc.clone());
return Some(arc);
}
Err(e) => {
tracing::warn!(
"operonx::bootstrap: failed to load resources.yaml at {}: {}",
path.display(),
e
);
return None;
}
}
}
ResourceHub::auto()
}
#[derive(Debug, Clone, Default)]
pub struct BootstrapOpts {
pub resources: Option<PathBuf>,
pub env: bool,
}
impl BootstrapOpts {
pub fn new() -> Self {
Self {
resources: None,
env: true,
}
}
pub fn resources(mut self, path: impl Into<PathBuf>) -> Self {
self.resources = Some(path.into());
self
}
pub fn no_env(mut self) -> Self {
self.env = false;
self
}
}
fn load_env_into_bootstrap() {
let cwd = match std::env::current_dir() {
Ok(p) => p,
Err(_) => return,
};
let env_path = cwd.join(".env");
record_env_path(env_path.clone());
if !env_path.exists() {
return;
}
if let Err(e) = dotenvy::from_path(&env_path) {
tracing::warn!(
".env present but failed to load ({}): {}",
env_path.display(),
e
);
}
}
pub fn cwd_resources_yaml() -> PathBuf {
std::env::current_dir()
.map(|p| p.join("resources.yaml"))
.unwrap_or_else(|_| PathBuf::from("resources.yaml"))
}
#[allow(dead_code)]
fn _path_use(_: &Path) {}