use schemars::{JsonSchema, Schema};
use serde::{de::DeserializeOwned, Serialize};
pub trait RpcMethod {
const NAME: &'static str;
const SUMMARY: &'static str;
const TAGS: &'static [&'static str] = &[];
const DEPRECATED: Option<&'static str> = None;
type Params: Serialize + DeserializeOwned + JsonSchema;
type Result: Serialize + DeserializeOwned + JsonSchema;
fn param_schema() -> Schema {
schemars::schema_for!(Self::Params)
}
fn result_schema() -> Schema {
schemars::schema_for!(Self::Result)
}
}
#[derive(Clone, Debug)]
pub struct MethodDoc {
pub name: String,
pub summary: String,
pub tags: Vec<String>,
pub deprecation: Option<String>,
pub params_schema: Schema,
pub result_schema: Schema,
}
impl MethodDoc {
pub fn from<M: RpcMethod>() -> Self {
Self {
name: M::NAME.to_string(),
summary: M::SUMMARY.to_string(),
tags: M::TAGS.iter().map(|tag| tag.to_string()).collect(),
deprecation: M::DEPRECATED.map(|msg| msg.to_string()),
params_schema: M::param_schema(),
result_schema: M::result_schema(),
}
}
}