use crate::types::{IntoResponse, RequestId, Response, Uri, request::RequestParamsMeta};
use serde::{Deserialize, Serialize};
pub mod commands {
pub const LIST: &str = "roots/list";
pub const LIST_CHANGED: &str = "notifications/roots/list_changed";
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Root {
pub uri: Uri,
pub name: String,
#[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
pub meta: Option<serde_json::Value>,
}
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub struct ListRootsRequestParams {
#[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
pub meta: Option<RequestParamsMeta>,
}
#[derive(Debug, Default, Serialize, Deserialize)]
pub struct ListRootsResult {
pub roots: Vec<Root>,
#[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
pub meta: Option<RequestParamsMeta>,
}
impl IntoResponse for ListRootsResult {
#[inline]
fn into_response(self, req_id: RequestId) -> Response {
match serde_json::to_value(self) {
Ok(v) => Response::success(req_id, v),
Err(err) => Response::error(req_id, err.into()),
}
}
}
impl From<Vec<Root>> for ListRootsResult {
#[inline]
fn from(roots: Vec<Root>) -> Self {
Self { roots, meta: None }
}
}
impl<U, N> From<(U, N)> for Root
where
U: Into<Uri>,
N: Into<String>,
{
#[inline]
fn from(parts: (U, N)) -> Self {
let (uri, name) = parts;
Self::new(uri, name)
}
}
impl Root {
pub fn new(uri: impl Into<Uri>, name: impl Into<String>) -> Self {
Self {
uri: uri.into(),
name: name.into(),
meta: None,
}
}
pub fn into_parts(self) -> (Uri, String) {
(self.uri, self.name)
}
}