Skip to main content

Message Routing

Message routing doesn't have a mandatory representation in code, but can be altered by using the #[route] attribute applied to the public methods of structs labelled with the #[program] or #[service] attribute. The concept itself is about rules for dispatching an incoming request message to a specific service's method using service and method names. By default, every service exposed via program is exposed using the name of the service constructor method converted into PascalCase. For example:

#[program]
impl MyProgram {
// The `MyPing` service is exposed as `PingSvc`
pub fn ping_svc(&self) -> MyPing {
...
}
}

This default behavior can be changed by applying the #[route] attribute:

#[program]
impl MyProgram {
// The `MyPing` service is exposed as `Ping`
#[route("ping")] // The specified name will be converted into PascalCase
pub fn ping_svc(&self) -> MyPing {
...
}
}

The same rules are applicable to service method names:

#[service]
impl MyPing {
// The `do_ping` method is exposed as `Ping`
#[route("ping")]
pub fn do_ping(&mut self) {
...
}

// The `ping_count` method is exposed as `PingCount`
pub fn ping_count(&self) -> u64 {
...
}
}