pub struct ServedRef { /* private fields */ }Expand description
The surfaces a router serves, held for as long as its reader needs them.
A resolution belongs to one generation of the repository and is replaced when the
repository moves under the process, so it cannot be lent out as a bare reference tied
to the router. This holds the generation alive while the caller reads it, and derefs to
the surfaces themselves so that a caller writes router.served()?.summary(url) exactly
as it did when the index was immutable.
// the surfaces, read through the generation that resolved them
let served: ServedRef = router.served().expect("a topology that resolves");
assert!(served.topology().surfaces.iter().any(|s| s.id == "home"));Methods from Deref<Target = Served>§
The same topology behind an Arc, for a context that hands it to a capability.
Sourcepub fn owner(&self, path: &str) -> Option<(&Surface, &Bound)>
pub fn owner(&self, path: &str) -> Option<(&Surface, &Bound)>
The surface that owns a request path, with what answers it.
Sourcepub fn ready(&self, id: &str) -> bool
pub fn ready(&self, id: &str) -> bool
Is a surface’s producer’s output there? A route the executable answers always is.
Sourcepub fn summary(&self, base: &str) -> String
pub fn summary(&self, base: &str) -> String
The one line a server logs when it starts: how many surfaces it serves and where
each one is, base prefixed so the log is clickable.
Every served surface, not only the public ones: this is an operator’s diagnostic, and the operator attaching a second client needs the MCP mount that the home page has no reason to advertise to a browser.
Both halves are read off the resolution. A surface added tomorrow is in this line, and a route that moves moves here, because nothing below names one.
use majordomus_cli::http::Served;
use majordomus_cli::web::{discover::{self, Runtime}, Topology};
let topology = Topology::new(discover::native_all());
let served = Served::resolve(&topology, std::path::Path::new("/nonexistent"), Runtime::full()).unwrap();
let line = served.summary("http://127.0.0.1:8741");
assert!(line.contains("http://127.0.0.1:8741/swagger"));
// the count is the resolution's, not a number written here: a surface added to
// native_all is in this line, and this assertion does not go stale for saying so
assert!(line.contains(&format!("{} surface(s)", discover::native_all().len())));