| Crates.io | duper_rpc |
| lib.rs | duper_rpc |
| version | 0.1.0 |
| created_at | 2026-01-03 17:01:29.377908+00 |
| updated_at | 2026-01-03 17:01:29.377908+00 |
| description | An RPC implementation for Duper. |
| homepage | https://duper.dev.br |
| repository | https://github.com/EpicEric/duper |
| max_upload_size | |
| id | 2020473 |
| size | 199,845 |
An RPC implementation for Duper.
Check out the specification for Duper RPC.
cargo add axum_duper duper_rpc
use axum::{extract::State, Router, routing::post};
use axum_duper::Duper;
use duper::DuperValue;
use duper_rpc::server::{IntoService, ServerPart};
use serde::{Deserialize, Serialize};
#[derive(Deserialize)]
struct Params {
text: String,
}
#[derive(Clone)]
struct AppState(u64);
async fn handle_only_state(duper_rpc::State(state): duper_rpc::State<AppState>) -> duper_rpc::Result<u64> {
Ok(state.0)
}
async fn handle_params(params: Params, flag: bool) -> duper_rpc::Result<String> {
if flag {
Ok(params.text)
} else {
Err(duper_rpc::Error::Custom(DuperValue::String {
identifier: None,
inner: "Flag is false".into()
}))
}
}
async fn rpc_handler(State(state): State<AppState>, request: Duper(duper_rpc::Request)) -> impl IntoResponse {
let Ok(response) = duper_rpc::Server::new()
.method("foo", handle_only_state)
.method("bar", handle_params)
.method("healthy", async || Ok(true))
.with_state(state)
.handle(request)
.await;
match response {
Some(response) => Duper(response).into_response(),
None => StatusCode::NO_CONTENT.into_response(),
}
}
let app = Router::new().route("/rpc", post(rpc_handler)).with_state(AppState(42));