adapter: implement protocol trait for rest

This commit is contained in:
github-ops
2026-05-14 18:00:12 +00:00
parent c8c7ee5472
commit d9065a737d
5 changed files with 148 additions and 2 deletions
+30 -2
View File
@@ -4,7 +4,7 @@ use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::{ExecutionMode, Protocol, StreamSession};
use crate::{ExecutionMode, Protocol, StreamSession, Target};
#[derive(Clone, Debug, PartialEq, Eq, Default)]
pub struct ResponseCacheScope {
@@ -112,13 +112,17 @@ pub trait ProtocolAdapter: Send + Sync {
async fn invoke_unary(
&self,
target: &Target,
prepared: &PreparedRequest,
context: &RuntimeRequestContext,
) -> Result<AdapterResponse, ProtocolAdapterError>;
async fn invoke_window(
&self,
_target: &Target,
_prepared: &PreparedRequest,
_window_duration_ms: u64,
_max_items: Option<u32>,
_context: &RuntimeRequestContext,
) -> Result<WindowExecutionResult, ProtocolAdapterError> {
Err(ProtocolAdapterError::UnsupportedMode {
@@ -129,6 +133,7 @@ pub trait ProtocolAdapter: Send + Sync {
async fn open_session(
&self,
_target: &Target,
_prepared: &PreparedRequest,
_context: &RuntimeRequestContext,
) -> Result<StreamSession, ProtocolAdapterError> {
@@ -184,7 +189,7 @@ mod tests {
AdapterRegistry, AdapterResponse, PreparedRequest, ProtocolAdapter, ProtocolAdapterError,
RuntimeRequestContext,
};
use crate::{ExecutionMode, Protocol};
use crate::{ExecutionMode, HttpMethod, Protocol, RestTarget, Target};
#[derive(Clone)]
struct StubAdapter(Protocol);
@@ -201,6 +206,7 @@ mod tests {
async fn invoke_unary(
&self,
_target: &Target,
_prepared: &PreparedRequest,
_context: &RuntimeRequestContext,
) -> Result<AdapterResponse, ProtocolAdapterError> {
@@ -244,4 +250,26 @@ mod tests {
assert_eq!(scope.workspace_key, "ws_01");
assert_eq!(scope.agent_key, "agent_01");
}
#[tokio::test]
async fn registry_returns_registered_adapter() {
let registry = AdapterRegistry::empty().register(Arc::new(StubAdapter(Protocol::Rest)));
let adapter = registry.get(Protocol::Rest).unwrap();
let response = adapter
.invoke_unary(
&Target::Rest(RestTarget {
base_url: "https://example.test".to_owned(),
method: HttpMethod::Get,
path_template: "/health".to_owned(),
static_headers: BTreeMap::new(),
}),
&PreparedRequest::default(),
&RuntimeRequestContext::from_request_id("req_1"),
)
.await
.unwrap();
assert_eq!(response.status_code, 200);
}
}