use std::sync::Arc;
use serde_json::Value;
use crate::core::exceptions::OperonError;
use crate::core::registry::{registry, ConfigDict, Factory, ResourceInstance};
use crate::telemetry::backends::langfuse::{LangfuseClient, LangfuseConfig};
pub struct LangfuseResource(pub Arc<LangfuseClient>);
pub fn register_langfuse() -> Result<(), OperonError> {
if registry().get_factory("langfuse").is_some() {
return Ok(());
}
let factory: Factory = Arc::new(|cfg: ConfigDict| {
let typed: LangfuseConfig = serde_json::from_value(Value::Object(cfg))?;
let client = Arc::new(LangfuseClient::new(typed));
Ok(Arc::new(LangfuseResource(client)) as ResourceInstance)
});
registry().register("langfuse", factory, Some("LangfuseConfig"))
}
pub fn register_all() -> Result<(), OperonError> {
register_langfuse()?;
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn register_all_installs_langfuse() {
register_all().unwrap();
assert!(registry().get_factory("langfuse").is_some());
}
}