// What a client is shown need not be what the program registered: a transform
// rewrites the components on their way out, so a server can present one set
// under a namespace, hide part of it, or hold a set back behind a tag.
///|
/// A rewrite of the components a server offers (← FastMCP's transforms).
///
/// The server applies every transform it was given to the whole set, in the
/// order they were added, each time the set is listed and before a call is
/// looked up. A transform therefore sees its predecessor's output: the order
/// is the meaning.
///
/// Every method has a default that leaves the set alone, so a transform
/// implements only the kinds it touches.
pub(open) trait Transform {
fn tools(Self, Array[@tools.Tool]) -> Array[@tools.Tool] = _
fn resources(Self, Array[@resources.Resource]) -> Array[@resources.Resource] = _
fn templates(Self, Array[@resources.ResourceTemplate]) -> Array[
@resources.ResourceTemplate,
] = _
fn prompts(Self, Array[@prompts.Prompt]) -> Array[@prompts.Prompt] = _
}
///|
impl Transform with fn tools(_self, tools) {
tools
}
///|
impl Transform with fn resources(_self, resources) {
resources
}
///|
impl Transform with fn templates(_self, templates) {
templates
}
///|
impl Transform with fn prompts(_self, prompts) {
prompts
}
///|
/// Serve one set of components through every transform, in order.
pub fn apply(
transforms : Array[&Transform],
tools : Array[@tools.Tool],
resources : Array[@resources.Resource],
templates : Array[@resources.ResourceTemplate],
prompts : Array[@prompts.Prompt],
) -> (
Array[@tools.Tool],
Array[@resources.Resource],
Array[@resources.ResourceTemplate],
Array[@prompts.Prompt],
) {
let mut tools = tools
let mut resources = resources
let mut templates = templates
let mut prompts = prompts
for transform in transforms {
tools = transform.tools(tools)
resources = transform.resources(resources)
templates = transform.templates(templates)
prompts = transform.prompts(prompts)
}
(tools, resources, templates, prompts)
}