# Interlink
![License](https://img.shields.io/github/license/jacobtread/interlink?style=for-the-badge)
![Cargo Version](https://img.shields.io/crates/v/interlink?style=for-the-badge)
![Cargo Downloads](https://img.shields.io/crates/d/interlink?style=for-the-badge)
*Interlink Async framework*
**Interlink** runs on the [Tokio](https://tokio.rs/) async runtime and structures portions of your
app using "Services" which can be communicated with using "Links" which allow sending messages to
Services that can then be handled
> 🚩 This project is in its very early infantcy so breaking changes are
> expected and at this stage its not entirely feature complete or tested
## Using Interlink
Adding the following cargo dependency to include interlink in your project
```toml
[dependencies]
interlink = "0.1"
```
## Starting a service
In order to get a link to a service and for the service to run you will first need to start the service
```rust
use interlink::prelude::*;
/// Define your backing structure for the service you can use
/// the service derive macro here or implement the trait to
/// get access to the `started` and `stopping` hooks
#[derive(Service)]
struct Example;
// You must be within the tokio runtime to use interlink
#[tokio::main]
async fn main() {
// Create the service
let service = Example {};
// Start the service to get a link to the service
let link = service.start();
}
```
## Sending a message to a service
To communicate with services and between services you use messages below
is an example of how to create and send messages.
```rust
use interlink::prelude::*;
// Define your backing structure for the service
#[derive(Service)]
struct Example;
// The message struct with a string response type
#[derive(Message)]
#[msg(rtype = "String")]
struct TextMessage {
value: String,
}
/// Implement a handler for the message type
impl Handler for Example {
/// Basic response type which just responds with the value
type Response = Mr;
fn handle(
&mut self,
msg: TextMessage,
ctx: &mut ServiceContext
) -> Self::Response {
println!("Got message: {}", &msg.value);
Mr(msg.value)
}
}
// You must be within the tokio runtime to use interlink
#[tokio::main]
async fn main() {
// Create the service
let service = Example {};
// Start the service to get a link to the service
let link = service.start();
// Send the text message to the service and await the response
let res: String = link.send(TextMessage {
value: "Example".to_string(),
})
.await
.unwrap();
assert_eq!(&res, "Example");
// You can also send without waiting for a response
link.do_send(TextMessage {
value: "Example".to_string(),
})
.unwrap();
}
```