use serde::{Deserialize, Serialize};
pub const SOCKET_ENV_VAR: &str = "ENWIRO_RPC_SOCKET";
pub const CALL_CHAIN_ENV_VAR: &str = "ENWIRO_RPC_CALL_CHAIN";
pub const SOCKET_FILENAME: &str = "rpc.sock";
pub const APPLICATION_ERROR_CODE: i32 = -32000;
pub const CYCLE_DETECTED_CODE: i32 = -32001;
pub fn default_socket_path() -> anyhow::Result<std::path::PathBuf> {
let base = dirs::runtime_dir()
.or_else(|| dirs::cache_dir().map(|d| d.join("run")))
.ok_or_else(|| anyhow::anyhow!("could not determine runtime or cache directory"))?;
Ok(base.join("enwiro").join(SOCKET_FILENAME))
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CookbookInvokeParams {
pub cookbook: String,
pub op: String,
#[serde(default)]
pub args: Vec<String>,
#[serde(default)]
pub payload: serde_json::Value,
#[serde(default)]
pub call_chain: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CookbookInvokeResult {
pub stdout: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EnvCurrentResult {
pub env_name: Option<String>,
pub timestamp: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EnvMarkParams {
pub env_name: String,
pub status: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EnvMarkResult {
pub ok: bool,
}
#[jsonrpsee::proc_macros::rpc(server, client)]
pub trait EnwiroRpc {
#[method(name = "cookbook.invoke")]
async fn cookbook_invoke(
&self,
params: CookbookInvokeParams,
) -> Result<CookbookInvokeResult, jsonrpsee::types::ErrorObjectOwned>;
#[method(name = "env.current")]
async fn env_current(&self) -> Result<EnvCurrentResult, jsonrpsee::types::ErrorObjectOwned>;
#[method(name = "env.mark")]
async fn env_mark(
&self,
params: EnvMarkParams,
) -> Result<EnvMarkResult, jsonrpsee::types::ErrorObjectOwned>;
}
pub mod client;
pub use client::{connect, connect_at};