61 lines
1.8 KiB
Markdown
61 lines
1.8 KiB
Markdown
# Eagle
|
|
|
|
## Disclaimer
|
|
|
|
Eagle is still in development and not currently usable. The current state is barely a proof of concept.
|
|
|
|
## What is Eagle?
|
|
|
|
Eagle is a library designed to make "full-stack" applications with Rust. It allows you to define a communication protocol
|
|
based on simple "questions" and "answers" which can be implemented as simple functions. From the perspective of the client
|
|
(which sends "questions") the protocol is simply a set of async functions on a struct. From the perspective of the server
|
|
(which sends "answers") the protocol is a trait which it implements on any struct of its choice.
|
|
|
|
## Using Eagle
|
|
|
|
The way that `eagle` is designed to be used is inside a shared dependency between your "server" and your "client". Both of these should be in a workspace. Create a `shared` crate which both components should depend on. Inside this crate, you can
|
|
define your protocol as an enum:
|
|
|
|
```rs
|
|
use eagle::Protocol;
|
|
|
|
#[derive(Protocol)]
|
|
pub enum TestProtocol {
|
|
Addition((i32, i32), i32),
|
|
SomeKindOfQuestion(String, i32)
|
|
}
|
|
```
|
|
|
|
In your server, you will be able to implement this protocol for any struct (and in the future register it for communication):
|
|
|
|
```rs
|
|
use shared::TestProtocolServer;
|
|
|
|
pub struct Server;
|
|
impl TestProtocolServer for Server {
|
|
fn addition(&mut self, a: i32, b: i32) -> i32 {
|
|
a + b
|
|
}
|
|
|
|
fn some_kind_of_question(&mut self, question: String) -> i32 {
|
|
42
|
|
}
|
|
}
|
|
```
|
|
|
|
In your client, you can use an instance of the client struct to query the server:
|
|
|
|
```rs
|
|
use shared::TestProtocolClient;
|
|
|
|
#[tokio::main]
|
|
async fn main() {
|
|
let client = TestProtocolClient::new();
|
|
assert_eq!(client.addition(2, 2).await, 4);
|
|
}
|
|
```
|
|
|
|
## License
|
|
|
|
Eagle is licensed under the AGPL (GNU Affero General Public License). To learn more, read [LICENSE.md](LICENSE.md)
|