# 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 protocl 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)